Xstream не поддерживает порядок дочерних элементов во время демаршаллинга - PullRequest
0 голосов
/ 01 февраля 2012

Как поддерживать порядок неупорядоченных дочерних объектов в наборе.Ниже мой xml, при преобразовании в порядок объектов Java, который я получаю в наборе, это не A, B, C.Как мне этого добиться?

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

Редактировать: Наблюдения:

  1. В моем классе Company.class я определил Set<Employee> и когдаxstream отменяет маршалинг, создает набор как HashMap, поэтому порядок не поддерживается. Ques) Как я могу использовать LinkedHashMap в xstream для поддержания порядка?

  2. Затем я определил набор сотрудников как LinkedHashSet<Employee>.Выполнение этого xstream создать набор как LinkedHashMap и порядок поддерживается, но Hibernate выдает исключение, потому что там я определил Set <set name="employees">, и он вызывает ошибку при приведении Seted к LinkedHashSet

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

Ответы [ 3 ]

2 голосов
/ 01 февраля 2012

Я полагаю, что вы ищете порядок, основанный на содержимом, а не порядок, в котором элемент emp встречается в экземпляре XML.Если это так, то SortedSet может поддерживать естественный порядок.Но не уверен, что xstream делает это просто.Если есть способ сопоставить его с SortedSet, тогда вы достигнете того, что ищете.

Если вы хотите, чтобы данные, упорядоченные по их вхождению в экземпляре XML, могли бы попросить xtream сопоставить их с реализациями List, но яЯ не уверен, что xstream гарантирует такое поведение.

Если заказ важен, то я предлагаю сделать его явно частью контракта , добавив атрибут порядка или индекса к элементу emp.

2 голосов
/ 01 февраля 2012

Набор не заказан. Если вам нравится определенный порядок, используйте список. Это не имеет ничего общего с xstream.

0 голосов
/ 02 февраля 2012

Я решил проблему с помощью своего пользовательского конвертера, но я думаю, что должен быть лучший способ использовать пользовательский конвертер для такой небольшой проблемы. Я продолжу искать, но до тех пор.

Добавить это

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;
    }
...