我正在使用 XStream 1.4.7,@XStreamAlias 注释用于自定义字段名称,@XStreamConverter 用于自定义转换器(表示日期和其他自定义 bean)。但是,甚至没有调用空值的自定义转换器。我的目标是序列化对象的所有字段,包括空字段,我不需要解组 XML。
我设法通过创建自定义 ReflectionConverter 来做到这一点。我从 XStream 库扩展了 ReflectionConverter 并覆盖了 doMarshal 方法。我唯一改变的是为 null info.values 调用 writeField 方法:
new Object() {
{
for (Iterator fieldIter = fields.iterator(); fieldIter.hasNext();) {
FieldInfo info = (FieldInfo) fieldIter.next();
if (info.value != null) {
//leave the code unchanged
...
} else {
//add this to write null info.value to xml
Log.info("MyCustomReflectionConverter -> serialize null field: " + info.fieldName);
writeField(info.fieldName, null, info.type, info.definedIn, info.value);
}
}
//... leave the rest of the code unchanged
}
};
之后,我创建了这样的 xStream 实例(以非常低的优先级注册您的转换器非常重要):
StaxDriver driver = new StaxDriver(new NoNameCoder()) {
@Override
public StaxWriter createStaxWriter(XMLStreamWriter out) throws XMLStreamException {
// the boolean parameter controls the production of XML declaration
return createStaxWriter(out, false);
}
};
XStream xStream = new XStream(driver);
xStream.autodetectAnnotations(true);//needed to process aliases
//register MyCustomReflectionConverter
MyCustomReflectionConverter reflectionConverter = new MyCustomReflectionConverter (xStream.getMapper(), new SunUnsafeReflectionProvider());
xStream.registerConverter(reflectionConverter, XStream.PRIORITY_VERY_LOW);
感谢 Mark Nabours 在这里的解决方案
希望能帮助到你。有没有人为此找到更好的解决方案?