我需要克隆一些jaxb对象(从xsd生成的代码实例化jaxb)。 Jaxb类似乎没有为这样做提供简单的界面。我无法手动编辑类并且无法扩展它 - 因此我需要创建一个帮助器/实用程序方法来执行此操作。什么是最好的方法?
答案 0 :(得分:8)
鉴于JAXB的目的,我认为最简单的方法是将您的对象编组为XML并将其解组。
关于Google的更多讨论。
在jaxb2-commons下还有一些discussion(以及下载链接)的Cloneable插件,虽然我在项目页面上找不到任何引用。
答案 1 :(得分:3)
您应该尝试使用sourceforge上提供的cc-xjc。它的一个功能是生成clone()和copy-constructors。
答案 2 :(得分:3)
您可以使用Copyable plugin。它生成深层复制/克隆方法(甚至可以使用策略进行自定义)。
答案 3 :(得分:3)
我已经在克隆JAXB对象的各种解决方案上运行基准测试。以下是一些结果:
使用mofokom's xjc-clone plugin似乎是最快的解决方案。它只是让您生成的所有文物都实现Cloneable
并公开覆盖Object.clone()
。不幸的是,这还没有进入Maven central(尚)。
生成Serializable
伪像并将它们序列化/反序列化为虚拟流比使用Java的克隆机制慢10倍:
public <T extends Serializable> 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();
}
编组/解组JAXB对象的速度比串行化/反序列化慢5倍。这是ykaganovich's解决方案建议的内容:
public <T extends Serializable> T clone(T jaxbObject) {
StringWriter xml = new StringWriter();
JAXB.marshal(jaxbObject, xml);
StringReader reader = new StringReader(xml.toString());
return JAXB.unmarshal(reader, jaxbObject.getClass());
}
答案 4 :(得分:1)
我们使用了jaxb2-basics插件 - 它在Maven repo中可用,只添加一个依赖项,也可用于生成其他有用的东西:equals,hashCode,toString,default values等。 有关详细信息,请参阅此链接:http://pragmaticintegrator.wordpress.com/2012/11/20/cloning-a-jaxb-object/
答案 5 :(得分:1)
这是一个旧线程,但我也必须创建可克隆的JAXB域对象,我认为编组 - 解组并不是最好的解决方案。
理想情况下,您应该使用生成的克隆方法在内存中复制对象。有一个Maven插件( maven-jaxb2-plugin ),您可以将其用于此目的。
这些是我的Maven pom.xml文件中的相关部分:
QWidget
...
<dependency>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-basics</artifactId>
<version>0.11.1</version>
</dependency>
注意 -Xcopyable 参数,该参数在所有对象中生成克隆方法。
如果您使用
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<extension>true</extension>
<schemaDirectory>${basedir}/src/main/xsd</schemaDirectory>
<bindingDirectory>${basedir}/src/main/xjb</bindingDirectory>
<args>
<arg>-Xcopyable</arg>
</args>
<plugins>
<plugin>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-basics</artifactId>
<version>1.11.1</version>
</plugin>
</plugins>
</configuration>
</plugin>
用于构建项目,这将生成具有克隆实现的域类。
这是其中一个域类中克隆相关方法的摘录:
mvn clean install
您可以在此页面上找到jaxb2基础知识项目的来源和示例:
https://github.com/highsource/jaxb2-basics/wiki/Sample-Projects
可以从这里下载包含有用示例的版本: