Java:我可以使用JAXB来序列化字符串列表吗?

时间:2014-10-28 17:58:39

标签: java xml serialization jaxb

我没有比字符串列表更复杂的东西。 我已经实现了几种方法,可以更简单地使用JAXB来序列化各种类。

List不存在于其他类中,它只是一个简单的List,我需要在运行时加载到ComboBox中,并允许用户在闲暇时保存/加载内容。

我是否可以使用JAXB序列化List对象,若然,怎么做?

2 个答案:

答案 0 :(得分:2)

有可能,但效率低于带List字段的简单包装类。

在您对@ BlaiseDoughan的回答发表评论之后,这是您的SaveableList实施。基本上你需要的是一个实现List的类,并将所有调用转发给内部List实现,例如ArrayList。在我的示例中,为了简单起见,我扩展了AbstractList

SaveableList实施:

class SaveableList extends AbstractList<String> {

    @XmlElement(name="e")
    private final List<String> list = new ArrayList<>();

    @Override
    public String get(int index) {
        return list.get(index);
    }

    @Override
    public boolean add(String e) {
        return list.add(e);
    }

    @Override
    public int size() {
        return list.size();
    }

    // You might want to implement/override other methods which you use
    // And is not provided by AbstractList

}

使用示例:

List<String> list = new SaveableList();
list.add("one");
list.add("two");

// Save it to XML
JAXB.marshal(list, new File("list.xml"));

// Load it from XML:
List<String> list2 = JAXB.unmarshal(new File("list.xml"), SaveableList.class);

以下是它生成的XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<saveableList>
    <e>one</e>
    <e>two</e>
</saveableList>

答案 1 :(得分:0)

JAXB要求您正在编组的对象是域对象。因此,您需要引入一个类似以下的包装器来进行编组。

 @XmlRootElement(name="strings)
 public class ListOfStrings {

     private List<String> strings;

     @XmlElement(name="string")
     public List<String> getStrings() {
         return strings;
     }

     public void setStrings(List<String> strings) {
         this.strings = strings;
     }

 }