ArrayList のサブクラスである自分のクラスのフィールドをシリアル化するのに問題があります。リストに追加されたアイテムはシリアル化されますが、フィールドはシリアル化されません。
@XmlRootElement
public static class NumberedList extends ArrayList<String>{
@XmlAttribute
private int number = 5;
@XmlList
public List<String> getNames(){
return this;
}
public NumberedList(){
add("a");
add("b");
}
}
@XmlRootElement
public static class FieldTest{
@XmlElement
NumberedList list = new NumberedList();
}
public static void main(String[] args) throws Exception{
JAXBContext context = JAXBContext.newInstance(FieldTest.class);
Marshaller marshaller = context.createMarshaller();
marshaller.marshal(new FieldTest(), System.out);
}
// NumberedList をフィールドとしてシリアル化した結果の出力: 数値フィールドは存在しません
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><fieldTest><list>a</list><list>b</list></fieldTest>
奇妙なことに、リストをマップに追加すると、クラスのフィールドが期待どおりにシリアル化されます。
@XmlRootElement
public static class NumberedList extends ArrayList<String>{
@XmlAttribute
private int number = 5;
@XmlList
public List<String> getNames(){
return this;
}
public NumberedList(){
add("a");
add("b");
}
}
@XmlRootElement
public static class MapTest{
@XmlElement
Map<Integer, NumberedList> map = Maps.newHashMap();
public MapTest(){
map.put(1, new NumberedList());
}
}
public static void main(String[] args) throws Exception{
JAXBContext context = JAXBContext.newInstance(MapTest.class);
Marshaller marshaller = context.createMarshaller();
marshaller.marshal(new MapTest(), System.out);
}
// Map 内の NumberedList のシリアライズからの出力:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><mapTest><map><entry><key>1</key><value number="5"><names>a b</names></value></entry></map></mapTest>
何か案は?