私は、xmlbeansを使用してjaxbを使用するようになったいくつかのコンポーネントのリファクタリングを担当しました。前の作成者がXmlObjectsの1つのcopy()関数を呼び出した場所に到達するまで、すべてが順調に進んでいます。xmlbeans内のすべてのオブジェクトはXmlObjectを拡張するため、魔法のディープコピー関数を無料で入手できます。
Jaxbはこれを提供していないようです。Jaxbオブジェクトのディープコピーを作成するための正しくて簡単な方法は何ですか?
私は、xmlbeansを使用してjaxbを使用するようになったいくつかのコンポーネントのリファクタリングを担当しました。前の作成者がXmlObjectsの1つのcopy()関数を呼び出した場所に到達するまで、すべてが順調に進んでいます。xmlbeans内のすべてのオブジェクトはXmlObjectを拡張するため、魔法のディープコピー関数を無料で入手できます。
Jaxbはこれを提供していないようです。Jaxbオブジェクトのディープコピーを作成するための正しくて簡単な方法は何ですか?
あなたはこれを参照することができます
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());
}
わたしにはできる。
JAXBSourceを使用できます
タイプFooのsourceObjectをディープコピーしたいとします。同じタイプに対して2つのJAXBContextを作成します。
JAXBContext sourceJAXBContext = JAXBContext.newInstance("Foo.class");
JAXBContext targetJAXBContext = JAXBContext.newInstance("Foo.class");
そして、次のことを行います。
targetJAXBContext.createUnmarshaller().unmarshal(
new JAXBSource(sourceJAXBContext,sourceObject);
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();
XSDのアノテーションを使用して、生成されたjaxbオブジェクトの基本クラスを宣言できます。
<xsd:annotation>
<xsd:appinfo>
<jaxb:globalBindings>
<xjc:superClass name="com.foo.types.support.JaxbBase" />
</jaxb:globalBindings>
</xsd:appinfo>
</xsd:annotation>
xmlbeans基本クラスをテンプレートとして使用して、そこにクローン化サポートを追加できます。