我没有比字符串列表更复杂的了。 我已经实现了几种方法来简化JAXB的使用来序列化各种类。Java:我可以使用JAXB来序列化一个字符串列表吗?
List没有其他类,它只是一个简单的List,我需要在运行时加载到ComboBox中,并允许用户在休闲时保存/加载内容。
我有可能使用JAXB来序列化一个List对象,如果是这样,如何?
我没有比字符串列表更复杂的了。 我已经实现了几种方法来简化JAXB的使用来序列化各种类。Java:我可以使用JAXB来序列化一个字符串列表吗?
List没有其他类,它只是一个简单的List,我需要在运行时加载到ComboBox中,并允许用户在休闲时保存/加载内容。
我有可能使用JAXB来序列化一个List对象,如果是这样,如何?
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;
}
}
这是可能的,但它会比用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>
是的,这是可能的。如果列表由序列化类中的字段引用,则可以使用@XmlElement对其进行注释。另请参阅此可能的重复:http://stackoverflow.com/questions/1603404/using-jaxb-to-unmarshal-marshal-a-liststring – 2014-10-28 18:12:39