在Java中使用序列化和取消序列化时如何处理类更改



我正在使用JavaFX创建一个小型应用程序,我有这样的类组织。

public class Context implements Serializable {
private static final long serialVersionUID = 12355322553L;
private A objA;
private List<A> aList;
...
}
public class A implements Serializable {
private static final long serialVersionUID = 467788765432L;
private B objB,
private List<B> bList;
...
}

出于备份目的,我使用序列化。

我的问题是:当您修改了类(例如添加新字段(时,如何处理反序列化。

当添加这样的新字段时:

public class Context implements Serializable{
private static final long serialVersionUID = 12355322553L;
private A objA;
private List<A> aList;
private String name;
...
}
public class A implements Serializable{
private static final long serialVersionUID = 467788765432L;
private B objB,
private List<B> bList;
...
}

当试图用我的新模型反序列化我的旧数据时,我得到了以下错误


java.io.EOFException
at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:3016)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1575)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2343)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2267)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2125)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1624)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2343)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2267)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2125)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1624)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:464)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:422)

您必须记住的第一件事是

private static final long serialVersionUID

不仅仅是类的随机装饰器,而是由VM用于序列化和反序列化对象,使用此ID,VM具有进程中涉及的类的引用,包括字段甚至方法,即,如果您通过添加以任何方式更改类,删除字段和/或方法,则VM将无法再反序列化对象,因为它被认为是一个完全不同的类

最新更新