JAXB - 如何序列化集合的子类中的字段

时间:2012-06-07 02:24:15

标签: java jaxb

我无法序列化我的类中的字段,这是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>

奇怪的是,当我将列表添加到Map时,我的类中的字段会按照我的预期进行序列化。

@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>

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

问题来自于NumberedList正在扩展ArrayList这一事实。向类中添加内部ArrayList,然后将其与NumberedList中存在的其他字段一起序列化。请参阅以下代码:

@XmlRootElement
public static class NumberedList {
    private List<String> names = new ArrayList<String>();

    @XmlAttribute
    private int number = 5;

    public NumberedList(){
        names.add("a");
        names.add("b");
    }

    @XmlList
    public List<String> getNames(){
        return names;
    }
}

答案 1 :(得分:-1)

我在两个类中看到你有根元素..这是根本错误的..你只能有一个根元素..所以从NumberedList中删除它。在第二步中,我看到你正在初始化地图

public MapTest(){
        map.put(1, new NumberedList());
    }

首先你没有这样做..