JAXB创建上下文和marshallers成本

Vla*_*mir 111 java jaxb marshalling

问题有点理论化,创建JAXB上下文,marshaller和unmarshaller的成本是多少?

我发现我的代码可以从保持相同的JAXB上下文和可能与所有编组操作相同的编组器中受益,而不是在每个编组时创建上下文和编组器.

那么创建JAXB上下文和marshaller/unmarshaller的成本是多少?是否可以为每个编组操作创建context + marshaller,或者最好避免它?

bdo*_*han 230

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

JAXBContext是线程安全的,只应创建一次并重复使用,以避免多次初始化元数据的成本. Marshaller并且Unmarshaller不是线程安全的,但是要创建轻量级,并且可以按操作创建.

  • 请在Javadoc中指定.让这些关键方面没有文件记录并不令人满意. (34认同)
  • 我相信你,但这是在文档中找到的吗? (7认同)
  • 很好的答案.我现在可以根据您在JAXB上的领导经验而自信. (6认同)
  • 在Javadoc中没有提到JAXBContext是线程安全的.几乎每个如何使用JAXB的例子都没有提到它应该被创建一次并在线程之间共享.因此,我现在正在从实时系统中删除另一个嚎叫资源泄漏.Grrrrrrr. (6认同)
  • 它记录在RI:https://jaxb.java.net/guide/Performance_and_thread_safety.html(但不是Moxy AFAIK) (3认同)

Sah*_*hoo 40

理想情况下,你应该有一个单身JAXBContext和本地实例MarshallerUnmarshaller.

JAXBContext实例是线程安全的,MarshallerUnmarshaller实例不是线程安全的,不应该跨线程共享.


JB *_*zet 14

遗憾的是,这在javadoc中没有具体描述.我能说的是Spring使用了一个在线程之间共享的全局JAXBContext,而它为每个编组操作创建了一个新的编组器,代码中的javadoc注释表明JAXB marshallers不一定是线程安全的.

本页也是如此:https://javaee.github.io/jaxb-v2/doc/user-guide/ch03.html#other-miscellaneous-topics-performance-and-thread-safety.

我猜想创建一个JAXBContext是一项代价高昂的操作,因为它涉及扫描类和注释的包.但测量它是最好的方法.