解组时,Xstream不维护子元素的顺序

时间:2012-02-01 14:00:11

标签: java xml xstream

如何维护Set中未编组的子对象的顺序。下面是我的xml,当转换为java对象时,我在set中的顺序不是A,B,C。我怎样才能做到这一点?

<company id="abc">
  <emp name="A"/>
  <emp name="B"/>
  <emp name="C"/>
</company>

修改: 观察:

  1. 在我的Company.class中,我定义了Set<Employee>,当xstream取消编组时,它会将集合创建为HashMap,因此不会维护订单。 问题 如何在xstream中使用LinkedHashMap维护订单?

  2. 然后我将员工集定义为LinkedHashSet<Employee>。执行此xstream创建set作为LinkedHashMap并保持顺序,但Hibernate抛出异常,因为我已经定义了Set <set name="employees">并且在将Set设置为LinkedHashSet时抛出错误

  3. public void setEmployees(Set<Employee> emps){
      this.packages = (LinkedHashSet<Employee>)emps;
    }
    

3 个答案:

答案 0 :(得分:2)

未订购套装。如果您喜欢deifnite订单,请使用列表。这与xstream没有任何关系。

答案 1 :(得分:2)

我相信您正在寻找基于内容而不是emp元素在XML实例中出现的顺序的排序。如果是这种情况,则SortedSet可以保持自然顺序。但不确定xstream是如何拆除它的。如果有办法将其映射到SortedSet,那么您就可以实现所需的目标。

如果您希望在XML实例中按其出现的顺序排序数据,那么您可以要求xtream将其映射到List实现,但我不确定xstream是否保证此行为。

如果订单很重要,那么我的建议是通过向emp元素添加订单或索引属性来明确明确合同的一部分

答案 2 :(得分:0)

我使用我的自定义转换器解决了这个问题,但我想必须有更好的方法来使用自定义转换器来解决这么小的问题。我会继续寻找,直到那时。

添加此

xstream.registerConverter(new CompanyConverter());

public Object unmarshal(HierarchicalStreamReader reader,UnmarshallingContext context) {

        Company comp = new Company();


        Set<Employee> packages = new LinkedHashSet<Employee>();

        while(reader.hasMoreChildren()){
            reader.moveDown();
            if("emp".equals(reader.getNodeName())){
                Employee emp = (Employee)context.convertAnother(comp, Employee.class);
                employees.add(emp);
            }
            reader.moveUp();
        }
        comp.setEmployees(employees);
        return comp;
    }