1

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

4

1 回答 1

0

你必须记住的第一件事是

private static final long serialVersionUID

不仅仅是类的随机装饰器,而是被 VM 用来序列化和反序列化对象,使用此 ID,VM 具有参与过程的类的引用,包括字段甚至方法,即如果您更改以任何方式添加、删除字段和/或方法的类,那么 VM 将不再能够反序列化对象,因为被认为是一个完全不同的类

于 2020-07-09T13:37:59.167 回答