私は 2 つの継承されたクラス ( ClassTop
--> ClassChild
) を持ち、それぞれが継承されたプロパティを持つデータ クラスを保持しています ( ClassTopData
--> ClassChildData
):
クラストップ:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="root")
public class ClassTop {
@XmlElement(name="title")
private String title = null;
@XmlElement(name="meta")
private ClassTopData meta = new ClassTopData();
public String getTitle() {return title;}
public void setTitle(String title) {this.title = title;}
public ClassTopData getMeta() {return meta;}
public void setMeta(ClassTopData meta) {this.meta = meta;}
}
ClassTop を拡張する ClassChild:
重要:ClassChild
も持ってproperty meta
いますが、次のバリアントを継承していますClassTopData
:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="news")
public class ClassChild extends ClassTop {
@XmlElement(name="childName")
private String childName = null;
@XmlElement(name="meta") // same property name...
private ClassChildData meta = new ClassChildData(); //... but subclassed data
public String getChildName() {return childName;}
public void setChildName(String childName) {this.childName = childName;}
public ClassChildData getMeta() {return meta;}
public void setMeta(ClassChildData meta) {this.meta = meta;}
}
そして、2 つのデータ クラス:
クラストップデータ:
@XmlAccessorType(XmlAccessType.FIELD)
public class ClassTopData {
private String data1 = null;
private String data2 = null;
public String getData1() {return data1;}
public void setData1(String data1) {this.data1 = data1;}
public String getData2() {return data2;}
public void setData2(String data2) {this.data2 = data2;}
}
ClassChildData :
@XmlAccessorType(XmlAccessType.FIELD)
public class ClassChildData extends ClassTopData {
private String data3 = null;
public String getData3() {return data3;}
public void setData3(String data3) {this.data3 = data3;}
}
ClassChild をマーシャリングして読み返すと、data3 は null です。
ClassChild a = new ClassChild();
a.setTitle("title");
a.getMeta().setData1("1");
a.getMeta().setData2("2");
a.getMeta().setData3("3");
// Write:
JAXBContext context = JAXBContext.newInstance(ClassChild.class);
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
m.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
... get some OutputStream os ...
m.marshal(a, os);
// Read back:
JAXBContext jc = JAXBContext.newInstance(ClassChild.class);
Unmarshaller u = jc.createUnmarshaller();
... get the InputStream is ...
ClassChild r = (ClassChild)(u.unmarshal(is));
System.out.println("data3: "+r.getMeta().getData3());
そして、出力は
data3: null
XML は次のようになります。
<?xml version="1.0" encoding="UTF-8"?>
<news>
<title>title</z:title>
<meta>
<data1>1</data1>
<data2>2</data2>
<data3>3</data3>
</meta>
</news>