向后兼容xstream

时间:2009-06-12 21:48:20

标签: java

我正在使用一小段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)

2 个答案:

答案 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可能在运行的应用程序的生命周期之外被持久化的情况。它太脆弱了(和马车)。即使他们需要更多的前期工作来配置,也可以选择更强大的编组框架。