[英]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.