複製する必要があるいくつかの jaxb オブジェクト (jaxb によって xsd から生成されたコードからインスタンス化されたもの) があります。Jaxb クラスは、これを簡単に行うためのインターフェースを提供していないようです。クラスを手動で編集することも拡張することもできないため、これを行うにはヘルパー/ユーティリティ メソッドを作成する必要があります。最善のアプローチは何ですか?
6 に答える
JAXB の目的を考えると、オブジェクトを XML にマーシャリングし、アンマーシャリングして戻すのが最も簡単な方法だと思います。
Googleでさらに多くの議論が行われています。
jaxb2-commons の下に Cloneable プラグインの議論(およびダウンロードへのリンク)もありますが、プロジェクト ページで参照を見つけることはできません。
sourceforge で入手できるcc-xjcを試す必要があります。その機能の 1 つは、 clone() および copy-constructors を生成することです。
JAXB オブジェクトのクローンを作成するためのさまざまなソリューションでベンチマークを実行しました。以下にいくつかの結果を示します。
mofokom の xjc-clone プラグインを使用するのが最速のソリューションのようです。生成されたすべてのアーティファクトを実装
Cloneable
し、公開してオーバーライドできるようにするだけObject.clone()
です。残念ながら、これは (まだ) Maven の中心にはなっていません。アーティファクトの生成
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のソリューションが示唆するものです:
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()); }
Copyable プラグインを使用できます。ディープ コピー/クローン メソッドを生成します (戦略でカスタマイズすることもできます)。