我没有比字符串列表更复杂的东西。 我已经实现了几种方法,可以更简单地使用JAXB来序列化各种类。
List不存在于其他类中,它只是一个简单的List,我需要在运行时加载到ComboBox中,并允许用户在闲暇时保存/加载内容。
我是否可以使用JAXB序列化List对象,若然,怎么做?
答案 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;
}
}