3
abstract Class A{

}


Class B extends A{

}


@XmlRootElement
Class C {
   @XmlElement(name = "tobeserialized")
   A tobeserialized;
}


Class D{
 public void marshal(){
 C all = getData();
 JAXB.marshal(all, new File("saved.xml");

  }

}

クラス B がクラス A のサブクラスであることを JAXB が認識できるようにするには、クラス A に @XmlSeeAlso(value = {B.class}) を配置する必要があります。A のサブクラスは約 50 あります。

しかし、プロジェクトの依存関係は、クラス A がクラス B にアクセスできないパッケージにあるようなものです。そのため、クラス A に注釈を付けることができません。

JAXB がクラス A のサブクラスをシリアル化できるようにするには、代替手段として何が考えられますか?

4

2 に答える 2

3

継承関係をマッピングする場合、@XmlSeeAlsoアノテーションは必要ありませんが、最も頻繁に使用される場合です。の役割は@XmlSeeAlso、クラスのトラバースから推測できないクラスのメタデータを取得して生成するように JAXB に指示することです。

あなたの例JAXBContextでは、クラスだけを作成した場合CJAXBContext.newInstance(C.class)) 、フィールドAのためにクラスも処理されますが、Javaにはサブクラスを見つけるメカニズムがないため処理されません。ブートストラップに使用されるクラスにサブクラスを配置するか、サブクラスを含めることで、これを解決できます。tobeserializedB@XmlSeeAlso(B.class)AJAXBContext

JAXBContext.newInstance(B.class, C.class);
于 2013-06-05T09:16:10.093 に答える
0

私には長い時間がかかりましたが、@XmlTransientクラス A と@XmlTypeクラス Bを追加してみてください。

または、クラス A と B (抽象的であるため) で具体的なサブクラス@XmlTransientに追加します。@XmlType

于 2013-06-05T09:03:08.880 に答える