пользовательский конвертер с xstream - PullRequest
1 голос
/ 24 августа 2011

Мне нужен конвертер для моего класса.

class Scope {
    private final String name;
    private final SomeProp prop;
    private final Item[] items;
    //...
}

Я зарегистрировал свой конвертер для SomeProp. Но я хочу использовать конвертер по умолчанию для Item (и всех подклассов).

Как я могу это сделать?

Я пытался переопределить маршал / демаршал:

public void marshal(Object val, HierarchicalStreamWriter writer, 
          MarshallingContext context) {
    //... saving name and prop
    writer.startNode("items");

    ArrayConverter conv = new ArrayConverter(mapper);
    assert(conv.canConvert(items.members.getClass()));
    conv.marshal(items.members, writer, context);

    writer.endNode);
}

public Object unmarshal(HierarchicalStreamReader reader,
    UnmarshallingContext context) {
    //... reading name and prop
    reader.moveDown();

    assert("items".equals(reader.getNodeName()));

    ArrayConverter conv = new ArrayConverter(mapper);
    Item[] items = (Item[])conv.unmarshal(reader, context);
    //...
}

но по какой-то причине не работает маршал.

Ответы [ 2 ]

1 голос
/ 24 августа 2011

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

Scope scope = ...;
XStream xstream = new XStream();
xstream.registerConverter(new SomePropConverter());
String xml = xstream.toXML(scope);

Если я что-то пропустил в вашем вопросе, уточните.

0 голосов
/ 25 августа 2011

Я прочитал исходный код для ArrayConverter и AbstractCollectionConverter и переписал unmarshal следующим образом:

while(reader.hasMoreChildren()) {    
    reader.moveDown(); 
    Class type = HierarchicalStreams.readClassType(reader, mapper); 
    Object item = context.convertAnother(context.currentObject(), type);  
    itemList.add((Item)item); 
    reader.moveUp(); 
}

Но я получил ошибку в случае циклических ссылок. Так что лучший способ был предложен Райаном Стюартом.

...