XStream: как маршалировать/демаршалировать списки в пользовательском конвертере?

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

class Test {

    // some other variables

    List<SomeType> someTypeList;

}

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

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

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

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


person tamm0r    schedule 27.09.2010    source источник


Ответы (2)


Вы мудры, чтобы получить структуру:

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

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

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

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

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

Затем создайте класс преобразователя (YourOwnConverter), который знал бы, как un/marshal:

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

person jazzcool    schedule 18.01.2011
comment
-1. Это не работает. См. этот ответ для правильного использования. - person Kane; 13.05.2013

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

person user467257    schedule 06.10.2010
comment
Существует аннотация @XStreamImplicit, которая пропускает родительский тег коллекции. - person digz6666; 30.09.2011