如何使XStream将旧的已删除字段映射到其他不同类型的字段?

时间:2018-07-25 14:27:22

标签: java xml xstream

我们对对象模型进行了更改,因此对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中找不到任何详细信息,只是在源头上找到了。

更新

在查看MapperAbstractReflectionConverter的用法的同时,我认为可以通过将旧字段作为新字段的别名,并拥有一个可以处理布尔值和枚举值的转换器来获得幸运:

xstream.aliasField("showABC", MyModel.class, "showOption");
xstream.registerLocalConverter(MyModel.class, "ShowOptions", new ShowConverter());

但是您不知道吗,它抛出了DuplicateFieldException,所以这种方法需要仔细考虑以允许覆盖(因为我们当然有了中间的XML,其中包含新旧的o_O);幸运的是,在旧字段之后声明了新字段,因此排序是可以的。

我以为这种转换要求并不罕见?!

0 个答案:

没有答案