如何克隆JAXB对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何克隆JAXB对象相关的知识,希望对你有一定的参考价值。

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

答案

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

关于Google的更多讨论。

JAXB常见问题解答suggests beanlib

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

另一答案

你应该尝试discussion,它可以在sourceforge上找到。它的一个特性是生成clone()和copy-constructors。

另一答案

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

  1. 使用cc-xjc似乎是最快的解决方案。它只是让你生成的所有文物都实现mofokom's xjc-clone plugin并公开覆盖Cloneable。不幸的是,这还没有进入Maven中心(尚)。
  2. 生成Object.clone()伪像并将它们序列化/反序列化为虚拟流比使用Java的克隆机制慢10倍: Serializable
  3. 编组/解组JAXB对象的速度比串行化/反序列化慢5倍。这就是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(); } 解决方案的建议: 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()); } 。它生成深层复制/克隆方法(甚至可以使用策略进行自定义)。

另一答案

我们使用了jaxb2-basics插件 - 它可以在Maven repo中使用,只添加一个依赖项,也可用于生成其他有用的东西:equals,hashCode,toString,默认值等。有​​关详细信息,请参阅此链接:Copyable plugin

另一答案

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

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

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

http://pragmaticintegrator.wordpress.com/2012/11/20/cloning-a-jaxb-object/

...

<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基础项目的来源和示例:

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

有用示例的发布可以从这里下载:

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

以上是关于如何克隆JAXB对象的主要内容,如果未能解决你的问题,请参考以下文章

如何获取JAXB对象的命名空间

如何调试 JAXB 解组?

如何在多个页面使用同一个HTML片段

JAXB:如何编组列表中的对象?

在将 XML 文件解组为对象后,如何让 JAXB 调用方法?

GitGit 分支管理 ( 克隆远程分支 | 克隆 master 分支 git clone | 查看远程分支 git branch -a | 克隆远程分支 git checkout -b )(代码片段