我正在使用XStream 1.4.7来处理POJO的de / serialization。随着项目的发展,我将需要添加新功能,因此需要添加新的类字段。我希望旧版本的应用程序能够优雅地处理这些更改并忽略未知标记。
xs = new XStream();
xs.setMode(XStream.NO_REFERENCES);
xs.ignoreUnknownElements();
xs.registerConverter(new JavaBeanConverter(xs.getMapper(),
new TransientRespectingBeanProvider()), XStream.PRIORITY_VERY_LOW);
昨天我在我的一个类中添加了一个String字段并对其进行了序列化。旧版本的应用程序无法对xml进行反序列化。
com.thoughtworks.xstream.converters.ConversionException: No field 'materialNrVersion' found in class 'com.company.ProjectConfiguration' : No field 'materialNrVersion' found in class 'com.company.ProjectConfiguration'
---- Debugging information ----
message : No field 'materialNrVersion' found in class 'com.company.ProjectConfiguration'
cause-exception : com.thoughtworks.xstream.converters.reflection.MissingFieldException
cause-message : No field 'materialNrVersion' found in class 'com.company.ProjectConfiguration'
class : com.company.ProjectConfiguration
required-type : com.company.ProjectConfiguration
converter-type : com.thoughtworks.xstream.converters.javabean.JavaBeanConverter
line number : 192
version : 1.4.7
我应该以不同的方式做这件事吗?
更新
如果我注释掉registerConverter
调用,则会忽略未知字段。 JavaBeanConverter
似乎正在影响ignoreUnknownElements
的处理方式。 TransientRespectingBeanProvider
旨在忽略具有@Transient
注释的属性。
有人可以建议解决方案或解决方法吗? @Transient
问题的另一种方法是什么?
答案 0 :(得分:0)
xStream源代码非常清晰明了。您可以继承JavaBeanConverter并调整其 unmarshal 方法,并为部分或全部类注册调整转换器。特别是,如果查看JavaBeanConverter.unmarhal()源代码,则有
if (propertyExistsInClass) {
...
} else {
throw new MissingFieldException(resultType.getName(), propertyName);
}
所以,如果你覆盖了类,复制原始的unmarshal方法代码,只注释掉 throw ... 行,它应该可以正常工作。我曾经多次使用XStream这样的黑客攻击,它总能像我预期的那样工作,没有令人讨厌的惊喜。