我们对对象模型进行了更改,因此对XML进行了更改,使得某些布尔字段不再被枚举所使用和取代。
例如说对象有
@XStreamAlias("showABC")
private boolean showABC;
现在已被
取代@XStreamAlias("showOption")
private ShowOptions showOption;
我想删除已失效的布尔值,但需要能够读取仍包含旧布尔值的旧XML,因为新字段需要基于旧的价值。
当前,我们只是将旧字段留在后面并标记为@Deprecated
,以便仍可以读取它们并让readResolve()
进行初始化,例如
if (showABC == false) {
showOption = ShowOptions.NONE;
}
将这些字段留在外面真是丑陋,污染了XML!
是否可以删除字段并创建转换器以执行正确的操作?我不想创建一个转换器来手动读取所有字段,因为其中有很多。< / p>
当前倾向于扩展AbstractReflectionConverter
并在doUnmarshal()
中苦思冥想的另一种丑陋方法,这样我就可以让handleUnknownField()
做一些更有用的事情。
但是有更好的解决方案吗?也许可以通过使用Mappers
来实现,尽管我在文档/ tut中找不到任何详细信息,只是在源头上找到了。
更新
在查看Mapper
中AbstractReflectionConverter
的用法的同时,我认为可以通过将旧字段作为新字段的别名,并拥有一个可以处理布尔值和枚举值的转换器来获得幸运:
xstream.aliasField("showABC", MyModel.class, "showOption");
xstream.registerLocalConverter(MyModel.class, "ShowOptions", new ShowConverter());
但是您不知道吗,它抛出了DuplicateFieldException
,所以这种方法需要仔细考虑以允许覆盖(因为我们当然有了中间的XML,其中包含新旧的o_O);幸运的是,在旧字段之后声明了新字段,因此排序是可以的。
我以为这种转换要求并不罕见?!