簡體   English   中英

在 Java 中使用序列化和反序列化時如何處理 class 更改

[英]How to handle class changes when using serializarion and deserialiazation in Java

我正在使用 JavaFX 創建一個小型應用程序,並且我有這種 class 組織。

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;
  ...
}

嘗試使用新的 model 反序列化舊數據時出現以下錯誤


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

不只是 class 的隨機裝飾器,而是被 VM 用於序列化和反序列化對象,使用此 ID,VM 具有 class 的引用,包括字段甚至方法,即如果您更改class 以任何方式添加,刪除字段和/或方法,然后VM將無法再反序列化對象,因為被視為完全不同的class

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM