如何使用XStream成功对其进行反序列化?
<MyElement name="abc">
<name>foo</name>
<value>123</name>
<name>bar</name>
<value>456</name>
</MyElement>
我已经尝试了以下内容,但是'name'属性没有被反序列化,我最终为该属性返回null。如果我将属性或子'name'元素重命名为其他东西(出于测试目的 - 我无法控制真实数据源),它可以正常工作。
public class MyElement {
@XStreamAsAttribute
String name;
@XStreamImplicit
@XStreamAlias("name")
List<String> paramNames;
@XStreamImplicit
@XStreamAlias("value")
List<String> paramValues;
...
}
我尝试将此表单用于名称列表,但XStream为我提供了“重复字段名称”例外。 (顺便说一句,任何一种形式都适用于'价值'列表。)
@XStreamImplicit(itemFieldName="name")
List<String> paramNames;
最后,我尝试按如下方式创建自定义转换器,但后来遇到了一个完全不同的问题,即读者无法向我提供顶级元素的属性。相反,当我使用任何reader.getAttribute *方法时,它会提供有关下一个子节点的属性而不是当前节点的信息! (但这是另一回事。)
public class MyElementConverter implements Converter {
@Override
public boolean canConvert(@SuppressWarnings("rawtypes") Class type) {
return MyElement.class.equals(type);
}
@Override
public void marshal(Object arg0, HierarchicalStreamWriter arg1,
MarshallingContext arg2) {
// Not used, so no implementation
}
@Override
public Object unmarshal(HierarchicalStreamReader reader,
UnmarshallingContext context) {
MyElement myElement = new MyElement();
myElement.setName(reader.getAttribute("name"));
myElement.setParamNames(new ArrayList<String>());
myElement.setParamValues(new ArrayList<String>());
while (reader.hasMoreChildren()) {
reader.moveDown();
if ("name".equals(reader.getNodeName())) {
myElement.getParamNames().add(reader.getValue());
}
else {
myElement.getParamValues().add(reader.getValue());
}
reader.moveUp();
}
return myElement;
}
}