Java 反序列化版本冲突

Java 反序列化版本冲突,java,deserialization,Java,Deserialization,我的问题是什么是实现升级过时对象的好方法 例如,假设您有这样一个类: public class Foo() implements Serializable { int a; String b; } 然后序列化这个对象。然后,稍后通过添加以下内容向类添加更多功能: ... int c; ... 您仍然希望保留序列化对象中的信息,但我知道,如果您尝试对其进行反序列化,将会出现冲突。那么,有没有一种方法(可能通过检查serialVersionUID)为int c设置一个值,知道它不

我的问题是什么是实现升级过时对象的好方法

例如,假设您有这样一个类:

public class Foo() implements Serializable {
    int a;
    String b;
}
然后序列化这个对象。然后,稍后通过添加以下内容向类添加更多功能:

...
int c;
...
您仍然希望保留序列化对象中的信息,但我知道,如果您尝试对其进行反序列化,将会出现冲突。那么,有没有一种方法(可能通过检查serialVersionUID)为
int c
设置一个值,知道它不存在


感谢

弃用现有类,使用新结构创建一个新类,并在新类中实现一个构造函数,该构造函数可以接受旧对象并将其转换为新版本


假设您根据接口创建了旧类,您可以用新类实现相同的接口,并且新对象仍将与旧类兼容。

您需要添加一个私有方法:

    private void readObject(ObjectInputStream ois) {
      // compare serialVersionUID and determine which fields to expect
      // read the expected fields for that version
      // initialize the new fields.
    }

有关更多信息,请阅读

您的意思是要添加一个
int c
还是以后的内容?因为
b
已经是一个
String
。哈哈,是的,我做了,傻我。太晚了,我不认为这会起作用,因为我仍然必须在一个不兼容的类中阅读,这将抛出一个错误。我不确定我是否同意你。你可以使用原始类重新读取对象,没有什么不兼容的,一旦对象被转换,你就可以序列化为新的对象类型。哦,我不知道你还打算继续使用旧类。但是这样做也意味着我的新类必须有一个不同的名称,我的问题是不断开发一个类,这样会让人恼火。对不起,我看了你的链接,这很有帮助。它说你可以像你说的那样实现readObject函数。但是Java仍然抱怨serialVersionUID不同。我到底如何实现这个函数呢?我把这个函数放在我的类中,然后放在Foo obj=(Foo)ois.readObject()中;ObjectStreamClass.lookup(obj.getClass()).getSerialVersionUID()根据我找到的一个站点,但由于serialVersionUID的不同,它仍然无法工作。看起来我可以做的是使用一个不同的变量来监控版本,并检查它,看看该做什么,因为这样它就不会出错。如果我错了,请纠正我,因为我想用正确的方式做这件事,我想学习。你可能是对的-请编码并确认。只需跟踪您的版本可能更简单-如1或2,甚至版本可以是字段数,因此您的版本差异将告诉您需要读取多少字段值。非常感谢。关于使用多个字段作为版本号的想法非常聪明。所以我试着这么做,但我似乎不知道该在函数中放什么。我不知道如何检查序列化对象的变量。我试着做一个ois.readObject,然后读取那个变量,但后来我得到一个OptionalDataException。还尝试了执行ois.defaultReadObject,然后通过this.version进行访问,但只显示了当前版本,而不是我保存的版本。非常感谢你的帮助。我想出了一个办法,虽然我不知道这是不是最好的办法哈哈。我所做的是将字段设置为
静态最终int NUM\u和
int version
变量。当我更新类时,我将不得不更改这两个选项,但它可以工作。在readObject函数中,我只是比较了
this.version
Foo.NUM\u字段
,这似乎满足了我的需要。再次感谢!