[英]Specify collection type in SimpleXML annotation
我正在使用简单XML库来序列化一组元素:
@Root(name = "items")
public class Items {
@ElementList(required = false, inline = true, entry = "item")
private Set<Item> items;
public Set<Item> getItems() {
return items;
}
public void setItems(final Set<Item> items) {
this.items = items;
}
}
我需要集合是一个Set
,但同时也需要整理-因为这个原因,序列化的时候,我用LinkedHashSet
作为实际类型的items
。
Set<Item> items = new LinkedHashSet<Item>();
items.add(...);
items.add(...);
items.add(...);
Items root = new Items();
root.setItems(items);
new Persister().write(root, stringWriter);
这样就可以正常工作,并且生成的XML包含正确顺序的Item
元素。
问题在于反序列化-简单XML看到类型为Set
,在CollectionFactory.getConversion()
选择一个实现: HashSet
,它不保留元素的顺序。
解决它的一种方法是更改Items
的定义:
@ElementList(required = false, inline = true, entry = "item")
private LinkedHashSet<Item> items;
public void setItems(final LinkedHashSet<Item> items) {
this.items = items;
}
这行得通,但实际上违反了良好的编码习惯。 有没有办法告诉简单XML使用LinkedHashSet
?
我猜问题是由内联引起的。 如果不使用inline
,则simple会将所有元素作为子元素放入set-tag中。 该标签包含例如class="java.util.LinkedHashSet"
属性,这使得可以确定set-implementation。
但这对于内联集合是不可能的,因此简单地采用默认集合即可。
你可以做什么:
private LinkedHashSet<Item> items;
正如您已经写过的-这使您很清楚想要什么实现 public Items() { this.items = new LinkedHashSet<>(); }
public Items() { this.items = new LinkedHashSet<>(); }
Converter
,在其中您可以自己处理反序列化(可能会导致过大杀伤力)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.