使用JavaBeanConverter时,XStream不会忽略未知元素

时间:2015-09-17 11:13:46

标签: java xstream

我正在使用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问题的另一种方法是什么?

1 个答案:

答案 0 :(得分:0)

xStream源代码非常清晰明了。您可以继承JavaBeanConverter并调整其 unmarshal 方法,并为部分或全部类注册调整转换器。特别是,如果查看JavaBeanConverter.unmarhal()源代码,则有

if (propertyExistsInClass) {
    ...
} else {
    throw new MissingFieldException(resultType.getName(), propertyName);
}

所以,如果你覆盖了类,复制原始的unmarshal方法代码,只注释掉 throw ... 行,它应该可以正常工作。我曾经多次使用XStream这样的黑客攻击,它总能像我预期的那样工作,没有令人讨厌的惊喜。