使用 jaxb 进行 XSLT 处理以实现小型转换性能
XSLT processing with jaxb for a small transformation performance
我有一个简单的改造。我有一个 java 对象可以转换为不同的 java 对象。所以我用了xslt。 jaxb 是我的处理器。
TransformerFactory transformerFactory = TransformerFactory.newInstance();
StreamSource streamSource = new StreamSource(
new File("conv.xsl"));
Transformer transformer = transformerFactory.newTransformer(streamSource);
JAXBContext jc =JAXBContext.newInstance(Bags.class);
JAXBSource jAXBSource = new JAXBSource(jc, device);
jAXBResult = new JAXBResult(JAXBContext.newInstance(LargeBags.class));
transformer.transform(jAXBSource, jAXBResult);
return result.getResult();
从性能的角度来看,这样做可以吗?我可以用 java 代码来做到这一点。这是一个很大的性能问题吗?还是一个好的做法?请帮助我并感谢您的意见。除此之外,如果我有小分组和计算,xslt 是一个好方法吗?
从性能的角度来看,它当然不是最优的:序列化到 xml、xml 的转换、xml 的反序列化都是代价高昂的操作。
但是,有时它是有道理的,如果你有很多 'similar' classes(例如不同的字段名称但匹配逻辑(例如一个有用户其他人字段等),作为编辑 xslt 工作表到提供实现转换比创建新适配器更快更容易 class.
但是你绝对应该加快速度,
一次创建 jaxbContext,而不是在每次调用时,创建 JAXB 上下文是非常昂贵的操作。例如将其存储在地图中,其中键是用于 JaxbCreation 的 class:
JAXBContext getContext(Class cls) {
if (contexts.containsKey(cls)) return contexts.get(cls);
JAXBContect context = JAXBContext.newInstance(cls);
contexts.put(cls,context);
return context;
}
...
JAXBContext jc =getContext(Bags.class);
同样的技巧,使用变形金刚。
记住转换器不是线程安全的,所以你需要
如果您的应用程序是多线程的,则在使用之前在转换器上同步。
我有一个简单的改造。我有一个 java 对象可以转换为不同的 java 对象。所以我用了xslt。 jaxb 是我的处理器。
TransformerFactory transformerFactory = TransformerFactory.newInstance();
StreamSource streamSource = new StreamSource(
new File("conv.xsl"));
Transformer transformer = transformerFactory.newTransformer(streamSource);
JAXBContext jc =JAXBContext.newInstance(Bags.class);
JAXBSource jAXBSource = new JAXBSource(jc, device);
jAXBResult = new JAXBResult(JAXBContext.newInstance(LargeBags.class));
transformer.transform(jAXBSource, jAXBResult);
return result.getResult();
从性能的角度来看,这样做可以吗?我可以用 java 代码来做到这一点。这是一个很大的性能问题吗?还是一个好的做法?请帮助我并感谢您的意见。除此之外,如果我有小分组和计算,xslt 是一个好方法吗?
从性能的角度来看,它当然不是最优的:序列化到 xml、xml 的转换、xml 的反序列化都是代价高昂的操作。 但是,有时它是有道理的,如果你有很多 'similar' classes(例如不同的字段名称但匹配逻辑(例如一个有用户其他人字段等),作为编辑 xslt 工作表到提供实现转换比创建新适配器更快更容易 class.
但是你绝对应该加快速度,
一次创建 jaxbContext,而不是在每次调用时,创建 JAXB 上下文是非常昂贵的操作。例如将其存储在地图中,其中键是用于 JaxbCreation 的 class:
JAXBContext getContext(Class cls) {
if (contexts.containsKey(cls)) return contexts.get(cls);
JAXBContect context = JAXBContext.newInstance(cls);
contexts.put(cls,context);
return context;
}
...
JAXBContext jc =getContext(Bags.class);
同样的技巧,使用变形金刚。
记住转换器不是线程安全的,所以你需要 如果您的应用程序是多线程的,则在使用之前在转换器上同步。