XStream: как упорядочить / распаковать списки в пользовательском конвертере? - PullRequest
4 голосов
/ 27 сентября 2010

У меня есть следующий класс (устаревший; не аннотируемый), который сериализован с помощью специального конвертера:

class Test {

    // some other variables

    List<SomeType> someTypeList;

}

Правильно работающий конвертер для SomeType уже доступен. Однако я хочу, чтобы список был сериализован так, как если бы он был аннотирован @XStreamAlias ​​("someTypes").

В конце я ожидаю следующий формат для someTypeList:

<someTypes class="list-type">
    <someType>
        ....
    </someType>
    ...
</someTypes>

Как мне реализовать метод маршала / демаршала, чтобы получить желаемый результат? Вызов context.convertAnother (someTypeList) не дал ожидаемого результата, так как отсутствовал окружающий тег <someTypes>.

Ответы [ 2 ]

3 голосов
/ 18 января 2011

Вы должны получить структуру:

<someTypes class="list-type">  
<someType>  
....  
</someType>  
...  
</someTypes>

Посмотрите на следующий код.Для вашего списка вам нужно пометить:

@XStreamImplicit(itemFieldName="someType")  
List<someType>List;

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

@XStreamImplicit(itemFieldName="someType")  @XStreamConverter(YourOwnConverter.class)  
List<SomeType> someTypeList;

Затем создайте класс конвертера (YourOwnConverter), который будет знать, как разархивировать / маршал:

public boolean canConvert(Class type) 
{
    return type.equals(SomeType.class);
}

public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) 
{
    SomeType mytype = (SomeType) source;
    writer.addAttribute("position", mytype.getPosition());
    writer.setValue(mytype.getId());
}
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) 
{
    SomeType mytype = new SomeType();
    String position =  reader.getAttribute("position");
    ......  
        return mytype ;
}

Используйте этокак пример: http://x -stream.github.io / converter-tutorial.html

0 голосов
/ 06 октября 2010

Есть ли addImplicitCollection, вызываемая для объекта xstream во время конфигурирования где-нибудь, что приводит к пропуску тега someTypes?

...