使用 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);

同样的技巧,使用变形金刚。

记住转换器不是线程安全的,所以你需要 如果您的应用程序是多线程的,则在使用之前在转换器上同步。