在SimpleXML注释中指定集合类型

时间:2014-01-19 09:59:28

标签: java xml collections simple-framework

我使用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

1 个答案:

答案 0 :(得分:1)

我猜这个问题是由内联引起的。如果您不使用inline,simple会将所有元素作为子元素放入set-tag中。此标记包含例如class="java.util.LinkedHashSet"属性,可以决定集合实现。

但对于内联集合来说这是不可能的,所以简单就是默认的。

你能做什么:

  1. 使用private LinkedHashSet<Item> items;已经写好了 - 这非常清楚你想要的实现
  2. 使用构造函数来实例化实现:public Items() { this.items = new LinkedHashSet<>(); }
  3. 写一个Converter,你自己处理反序列化(可能是一个过度杀伤)。