我使用Simple XML library来序列化一组元素:
@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
作为{{1}的实际类型}}
items
这很好,生成的XML包含正确顺序的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
,选择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;
}
这很有效,但它确实违反了良好的编码习惯。 有没有办法告诉Simple XML使用LinkedHashSet
?
答案 0 :(得分:1)
我猜这个问题是由内联引起的。如果您不使用inline
,simple会将所有元素作为子元素放入set-tag中。此标记包含例如class="java.util.LinkedHashSet"
属性,可以决定集合实现。
但对于内联集合来说这是不可能的,所以简单就是默认的。
你能做什么:
private LinkedHashSet<Item> items;
已经写好了 - 这非常清楚你想要的实现public Items() { this.items = new LinkedHashSet<>(); }
Converter
,你自己处理反序列化(可能是一个过度杀伤)。