繁体   English   中英

在SimpleXML批注中指定集合类型

[英]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。

但这对于内联集合是不可能的,因此简单地采用默认集合即可。

你可以做什么:

  1. 使用private LinkedHashSet<Item> items; 正如您已经写过的-这使您很清楚想要什么实现
  2. 在实例化实现的地方使用构造函数: public Items() { this.items = new LinkedHashSet<>(); } public Items() { this.items = new LinkedHashSet<>(); }
  3. 编写一个Converter ,在其中您可以自己处理反序列化(可能会导致过大杀伤力)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM