1

我有以下代码来执行从一个 JAXB 注释对象到另一个 JAXB 注释对象的 XSLT 转换。在这种情况下,性能真的会很差吗?它将 JAXB 对象编组为 XML,将其转换为另一个 XML 并解组,还是这里有更好的技巧?

TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer(new StreamSource(mapping.getInputStream()));
JAXBResult result = new JAXBResult(JaxbUtils.getJAXBContext(CalypsoUploadDocument.class));
transformer.transform(new JAXBSource(JaxbUtils.getJAXBContext(CalypsoUploadDocument.class), uploadMessage),result);

return result.getResult();
4

3 回答 3

2

如果使用 Java 6(我的生产经验基于 Oracle JDK),这也是我们采用的有效方法。性能相当不错。一个小的改进是使用模板实例。

另一方面,如果您的应用程序有一个或几个转换,并且转换本身不会随着时间而改变,我不推荐这种方法。然后直接的方法要快得多(java实例-> java映射-> java实例)

于 2012-11-28T14:21:38.903 回答
2

注意: 我是EclipseLink JAXB (MOXy)负责人,也是JAXB (JSR-222)专家组的成员。

替代方法

如果您碰巧使用 MOXy 作为您的 JAXB 提供程序,那么您可以拥有一个映射到两个 XML 模式的 Java 模型。您可以使用标准 JAXB (JSR-222) 注释映射到第一个,并使用 MOXy 的外部映射文档映射到第二个。下面是我博客的链接,我使用这种方法将一个对象模型映射到 Google 和 Yahoo 天气服务的输出。

于 2012-11-28T16:10:24.707 回答
2

这取决于 XSLT 处理器。Saxon 的商业版可以在流模式下做一些转换。JAXBSource扩展SAXSource等也适用于事件流。对于更复杂的转换或使用其他 XSLT 处理器,实现可能首先创建一个内部树状结构。这种结构通常比 DOM 树更优化,性能更好,请参阅比较 DOM 和其他对象模型以获取一些基准。最好自己对代码进行基准测试或分析,看看性能是否可以接受。

关于您的代码的一个注释,JAXBContext创建成本很高,应该在应用程序的生命周期内缓存。如果您的JaxbUtils班级还没有这样做,那么重用上下文可以很好地提高性能。

于 2012-11-28T14:22:26.010 回答