9

複製する必要があるいくつかの jaxb オブジェクト (jaxb によって xsd から生成されたコードからインスタンス化されたもの) があります。Jaxb クラスは、これを簡単に行うためのインターフェースを提供していないようです。クラスを手動で編集することも拡張することもできないため、これを行うにはヘルパー/ユーティリティ メソッドを作成する必要があります。最善のアプローチは何ですか?

4

6 に答える 6

8

JAXB の目的を考えると、オブジェクトを XML にマーシャリングし、アンマーシャリングして戻すのが最も簡単な方法だと思います。

Googleでさらに多くの議論が行われています。

JAXB FAQはbeanlibを提案して います。

jaxb2-commons の下に Cloneable プラグインの議論(およびダウンロードへのリンク)もありますが、プロジェクト ページで参照を見つけることはできません。

于 2009-05-30T23:35:46.150 に答える
3

sourceforge で入手できるcc-xjcを試す必要があります。その機能の 1 つは、 clone() および copy-constructors を生成することです。

于 2011-02-03T19:37:56.813 に答える
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 に答える
3

Copyable プラグインを使用できます。ディープ コピー/クローン メソッドを生成します (戦略でカスタマイズすることもできます)。

于 2011-09-11T18:26:02.360 に答える