我需要为我的班级定制转换器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);
//...
}
但由于某种原因,解组是行不通的。
答案 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的消息。