我正在使用一小段xstream来执行序列化。
我有以下课程:
// version 0
class A {
}
// version 1
class A {
Object o = new Object();
}
为了让我读取版本0 xml文件来构建版本1的A类,我将不得不在版本1的A类中添加以下方法:
class A {
private Object readResolve()
{
/* For backward compatible */
if (o == null) { o = new Object(); }
}
Object o = new Object();
}
到目前为止一切正常。
现在,情况正在逆转。
我有以下课程:
// version 0
class A {
Object o = new Object();
}
// version 1
class A {
}
如何才能读取xml文件版本0,构建A类版本1?
如果您尝试这样做,以下是您将获得的例外情况:
run:
com.thoughtworks.xstream.converters.ConversionException: a : a
---- Debugging information ----
message : a : a
cause-exception : com.thoughtworks.xstream.mapper.CannotResolveClassException
cause-message : a : a
class : javaapplication15.Main$A
required-type : javaapplication15.Main$A
path : /javaapplication15.Main$A/a
line number : 2
-------------------------------
null
BUILD SUCCESSFUL (total time: 2 seconds)
答案 0 :(得分:1)
目前,我正在使用以下策略向后兼容:
// version 0
class A {
Object o = new Object();
}
// version 1
class A {
// This will ensure o will not be be read, or be written into file.
// transient keyword which prevent read, will only work well for xstream 1.3.1
transient Object o = new Object();
}
// version 2. Slowly phase out Object o, after class A had been deployed for quite sometime.
class A {
}
答案 1 :(得分:0)
你可以为A类注册一个自定义转换器,它可以控制msrshalling和unmarshalling。不过,这是一个非常重要的解决方案,并且使XStream的吸引力降低了。
正是因为这样的情况,我倾向于避免XStream用于除了非常微不足道的情况之外的所有事情,并且从不会出现XML可能在运行的应用程序的生命周期之外被持久化的情况。它太脆弱了(和马车)。即使他们需要更多的前期工作来配置,也可以选择更强大的编组框架。