如何维护Set中未编组的子对象的顺序。下面是我的xml,当转换为java对象时,我在set中的顺序不是A,B,C。我怎样才能做到这一点?
<company id="abc">
<emp name="A"/>
<emp name="B"/>
<emp name="C"/>
</company>
修改: 观察:
在我的Company.class中,我定义了Set<Employee>
,当xstream取消编组时,它会将集合创建为HashMap,因此不会维护订单。
问题 如何在xstream中使用LinkedHashMap维护订单?
然后我将员工集定义为LinkedHashSet<Employee>
。执行此xstream创建set作为LinkedHashMap并保持顺序,但Hibernate抛出异常,因为我已经定义了Set <set name="employees">
并且在将Set设置为LinkedHashSet时抛出错误
public void setEmployees(Set<Employee> emps){ this.packages = (LinkedHashSet<Employee>)emps; }
答案 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;
}