2

私は、xmlbeansを使用してjaxbを使用するようになったいくつかのコンポーネントのリファクタリングを担当しました。前の作成者がXmlObjectsの1つのcopy()関数を呼び出した場所に到達するまで、すべてが順調に進んでいます。xmlbeans内のすべてのオブジェクトはXmlObjectを拡張するため、魔法のディープコピー関数を無料で入手できます。

Jaxbはこれを提供していないようです。Jaxbオブジェクトのディープコピーを作成するための正しくて簡単な方法は何ですか?

4

4 に答える 4

7

あなたはこれを参照することができます

public static <T> T deepCopyJAXB(T object, Class<T> clazz) {
  try {
    JAXBContext jaxbContext = JAXBContext.newInstance(clazz);
    JAXBElement<T> contentObject = new JAXBElement<T>(new QName(clazz.getSimpleName()), clazz, object);
    JAXBSource source = new JAXBSource(jaxbContext, contentObject);
    return jaxbContext.createUnmarshaller().unmarshal(source, clazz).getValue();
  } catch (JAXBException e) {
      throw new RuntimeException(e);
  }
}

public static <T> T deepCopyJAXB(T object) {
  if(object==null) throw new RuntimeException("Can't guess at class");
  return deepCopyJAXB(object, (Class<T>) object.getClass());
}

わたしにはできる。

すべてのクレジットはhttps://gist.github.com/darrend/821410に送られます

于 2015-06-03T09:53:41.540 に答える
4

JAXBSourceを使用できます

タイプFooのsourceObjectをディープコピーしたいとします。同じタイプに対して2つのJAXBContextを作成します。

JAXBContext sourceJAXBContext = JAXBContext.newInstance("Foo.class");
JAXBContext targetJAXBContext = JAXBContext.newInstance("Foo.class");

そして、次のことを行います。

targetJAXBContext.createUnmarshaller().unmarshal(
  new JAXBSource(sourceJAXBContext,sourceObject);
于 2010-10-10T10:15:16.847 に答える
3

JAXBクラスをシリアル化可能にしてから、オブジェクトをシリアル化および逆シリアル化することでオブジェクトをディープコピーすることができます。コードは次のようになります。

Object obj = ...  // object to copy

ObjectOutputStream out = new ObjectOutputStream(new ByteArrayOutputStream());
out.writeObject(obj);
byte[] bytes = baos.toByteArray();

ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(bytes));
Object copy = in.readObject();
于 2009-05-18T20:20:36.070 に答える
3

XSDのアノテーションを使用して、生成されたjaxbオブジェクトの基本クラスを宣言できます。

<xsd:annotation>
  <xsd:appinfo>
    <jaxb:globalBindings>
      <xjc:superClass name="com.foo.types.support.JaxbBase" />
    </jaxb:globalBindings>
  </xsd:appinfo>
</xsd:annotation>

xmlbeans基本クラスをテンプレートとして使用して、そこにクローン化サポートを追加できます。

于 2009-05-19T03:07:56.123 に答える