2012-03-13 62 views
3

假設我序列下面的類(通過把一個值到現場x,說5),做反序列化之前,我刪除場x並提出一個新的領域yintfloat),是什麼會是結果嗎?系列化和desrialization可變刪除

我相信反序列化已經成功完成,並且字段y的值將是默認的,這是正確的嗎?

如果這是正確的,那麼x的值將在序列化時從持久對象過渡到有狀態對象的位置?

public class Cat implements Serializable{  
    private static final long serialVersionUID = 4231235177539824282L; 
    int x; 
} 

反序列化之前:

public class Cat implements Serializable{  
    private static final long serialVersionUID = 4231235177539824282L; 
    float/int y; 
} 

回答

6

的系列化規格細節場反序列化的內部運作(你可以在這裏找到:http://docs.oracle.com/javase/7/docs/platform/serialization/spec/input.html

如果您瀏覽「的readObject方法」一節也指出:

任何未出現在流中的對象字段被設置爲其默認值 。丟棄流中出現但不在 對象中的值。這主要發生在一個 類的更高版本上撰文指出,不要在早期版本 出現附加字段。

所以在本質上,字段「X」將具有流中的某個值,但將被丟棄和場「Y」將被設置爲0(默認值),因爲它不流中出現。

2

Jain007,我想你可能會得到一個異常在這種情況下,你有「刪除」的字段。

僅供參考,以下是可能會導致異常的不兼容的改變: - 刪除字段 - 更改類層次結構 - 改變非靜態靜態 - 改變非瞬態瞬態 - 的更改類型原始場

雖然下面是不會影響反序列化過程中兼容的改變: - 添加字段 - 從靜態字段改爲非靜態 - 從瞬態場更改爲非暫時性 - 添加類對象樹

+0

爲我檢查JDK5,具有定義的serialVersionUID這種情況並非如此之多 - 沒有什麼異常,但隨後也我不知道,因爲我也是不相信,想知道到底發生了什麼 – 2012-03-13 11:51:13