java - xstream 中向后兼容

标签 java

我正在使用 xstream 的一小部分来执行序列化。

我有以下类(class):

// 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();
}

到目前为止效果很好。

现在,情况正在逆转。

我有以下类(class):

// 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)

最佳答案

目前,我使用以下策略进行向后兼容:

// 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 {
}

关于java - xstream 中向后兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/989228/

相关文章:

java - 重写私有(private)方法

java - 无法应用客户JPanel

java - 为什么java.util.Arrays中的binarySearch()方法是使用循环实现的?

java - 当索引的范围通过 and 限制时,Hotspot 可以消除边界检查吗?

java - 登录后 session ID 更改和属性复制

java - Kotlin 接口(interface)可以缓存值吗?

JAVAPreparedStatement参数值出现在查询中

javax.xml.bind.MarshalException - 链接异常 : [javax. xml.bind.JAXBException: class ** 其父类(super class)在此上下文中不为人所知

java - 结果集节点的问题

java - 为什么 GWT 开发模式 "restart server"失败?