如何克隆JAXB对象

我有一些jaxb对象(从xsd生成的代码实例化jaxb)我需要克隆。 Jaxb类似乎没有为这样做提供简单的界面。 我无法手动编辑类并且无法扩展它 – 因此我需要创建一个帮助器/实用程序方法来执行此操作。 什么是最好的方法?

鉴于JAXB的目的,我认为最简单的方法是将您的对象编组为XML并将其解组。

关于谷歌的更多讨论。

JAXB FAQ 建议 beanlib 。

在jaxb2-commons下还有一些Cloneable插件的讨论 (以及下载链接),虽然我在项目页面上找不到任何引用。

您应该尝试cc-xjc ,它可以在sourceforge上找到。 它的一个function是生成clone()和copy-constructors。

您可以使用Copyable插件 。 它生成深层复制/克隆方法(甚至可以使用策略进行自定义)。

我已经在克隆JAXB对象的各种解决方案上运行基准测试。 以下是一些结果:

  1. 使用mofokom的xjc-clone插件似乎是最快的解决方案。 它只是让你生成的所有文物实现Cloneable并公开覆盖Object.clone() 。 不幸的是,这还没有进入Maven中心(尚)。

  2. 生成可Serializable伪像并将它们序列化/反序列化为虚拟流比使用Java的克隆机制慢10倍:

     public  T clone(T jaxbObject) { ByteArrayOutputStream out = new ByteArrayOutputStream(); ObjectOutputStream o = new ObjectOutputStream(out); o.writeObject(jaxbObject); o.flush(); ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray()); ObjectInputStream i = new ObjectInputStream(in); return (T) i.readObject(); } 
  3. 编组/解组JAXB对象的速度比串行化/反序列化慢5倍。 这就是ykaganovich的解决方案所暗示的:

     public  T clone(T jaxbObject) { StringWriter xml = new StringWriter(); JAXB.marshal(jaxbObject, xml); StringReader reader = new StringReader(xml.toString()); return JAXB.unmarshal(reader, jaxbObject.getClass()); } 

我们使用了jaxb2-basics插件 – 它在Maven repo中可用,只添加一个依赖项,也可用于生成其他有用的东西:equals,hashCode,toString,默认值等。请参阅此链接了解详细信息: http ://pragmaticintegrator.wordpress.com/2012/11/20/cloning-a-jaxb-object/

这是一个旧线程,但我也必须创建可克隆的JAXB域对象,我认为编组 – 解组并不是最好的解决方案。

理想情况下,您应该使用生成的克隆方法在内存中复制对象。 有一个Maven插件( maven-jaxb2-plugin )可以用于此目的。

这些是我的Maven pom.xml文件中的相关部分:

  org.jvnet.jaxb2_commons jaxb2-basics 0.11.1  

  org.jvnet.jaxb2.maven2 maven-jaxb2-plugin    generate     true ${basedir}/src/main/xsd ${basedir}/src/main/xjb  -Xcopyable    org.jvnet.jaxb2_commons jaxb2-basics 1.11.1     

请注意-Xcopyable参数,该参数在所有对象中生成克隆方法。

如果你使用

 mvn clean install 

为了构建项目,这将生成具有克隆实现的域类。

这是其中一个域类中克隆相关方法的摘录:

 public Object clone() { return copyTo(createNewInstance()); } public Object copyTo(Object target) { final CopyStrategy2 strategy = JAXBCopyStrategy.INSTANCE; return copyTo(null, target, strategy); } 

您可以在此页面上找到jaxb2基础知识项目的来源和示例:

https://github.com/highsource/jaxb2-basics/wiki/Sample-Projects

有用示例的版本可以从这里下载:

https://github.com/highsource/jaxb2-basics/releases