9

我有一些需要克隆的 jaxb 对象(由 jaxb 从 xsd 生成的代码实例化)。Jaxb 类似乎没有提供一个接口来轻松地做到这一点。我不能手动编辑类,也不能扩展它——所以我需要创建一个帮助器/实用程序方法来做到这一点。最好的方法是什么?

4

6 回答 6

8

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

更多关于谷歌的讨论。

JAXB FAQ建议 使用 beanlib

还有一些关于 jaxb2-commons 下的 Cloneable 插件的讨论(以及下载链接),尽管我在项目页面上找不到任何参考。

于 2009-05-30T23:35:46.150 回答
3

您应该尝试cc-xjc,它可以在 sourceforge 上找到。它的功能之一是生成 clone() 和复制构造函数。

于 2011-02-03T19:37:56.813 回答
3

您可以使用Copyable 插件。它生成深拷贝/克隆方法(甚至可以使用策略自定义)。

于 2011-09-11T18:26:02.360 回答
3

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

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

  2. 生成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();
    }
    
  3. 编组/解组 JAXB 对象再次比序列化/反序列化慢 5 倍。这就是ykaganovich 的解决方案所暗示的:

    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());
    }
    
于 2012-06-03T13:37:43.490 回答
1

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

于 2013-04-09T12:19:02.570 回答
1

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

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

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

<dependency>
    <groupId>org.jvnet.jaxb2_commons</groupId>
    <artifactId>jaxb2-basics</artifactId>
    <version>0.11.1</version>
</dependency>

...

<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>

请注意-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

于 2017-04-26T18:49:42.667 回答