使用xstream定制转换器

时间:2011-08-24 10:00:50

标签: java converter xstream

我需要为我的班级定制转换器Scope:

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

我为SomeProp注册了我的转换器。但是我想为Item(以及所有子类)使用默认转换器。

我怎么做?

我试图重写marshal / unmarshal:

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 个答案:

答案 0 :(得分:1)

您的描述不是很清楚,但我认为您正在努力做更多的工作而不是需要。如果你想要SomeProp的自定义转换器和其他所有的默认转换器,你所要做的就是

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

如果我错过了你的问题,请澄清。

答案 1 :(得分:0)

我阅读了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(); 
}

但是在循环引用的情况下我遇到了错误。 因此最好的方式是Ryan Stewart的消息。