2016-08-25 103 views
0

下面是我的示例代碼:Java序列 - 對象寫入對象文件後修改

public class Hybrid { 
public static void main(String[] args) { 
    Cultivate cultivate1 = new Cultivate(); 
    try{ 
     ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("myfile")); 
     os.writeObject(cultivate1); 
     os.close(); 

     System.out.println("line 1 : "+ ++cultivate1.z+" "); 

     ObjectInputStream is = new ObjectInputStream(new FileInputStream("myfile")); 
     Cultivate cultivate2 = (Cultivate)is.readObject(); 
     is.close(); 

     System.out.println("line 2 : "+cultivate1.y+" "+cultivate2.z); 

    } catch(Exception x){ 
     System.out.println("exc"); 
    } 
} 
} 
class Cultivate implements Serializable{ 
    transient int y=3; 
    static int z = 6; 
} 

這裏是輸出:

line 1 : 7 
line 2 : 3 7 

有人能解釋爲什麼cultivate2.z打印7? 在輸出流關閉後,cultivate1.z的值遞增。那麼這種修改如何反映在去電之後呢?

回答

2

靜態變量是不會被序列化,所以反序列化過程中的靜態變量值將從類加載(當前值將被載入。)

這裏從的ObjectOutputStream的JavaDoc:

默認對象的序列化機制寫入對象的類,類簽名以及所有非瞬態和非靜態字段的值。對其他對象(除了在瞬態或靜態字段中)的引用也會導致寫入這些對象。對單個對象的多個引用使用引用共享機制進行編碼,以便可以將對象的圖形恢復爲與原始寫入時相同的形狀。

2

z是一個靜態字段,即它是一個Class級別字段而不是一個實例專用字段。

靜態變量屬於一個類而不屬於任何單個實例。序列化的概念涉及對象的當前狀態。只有與某個類的特定實例關聯的數據才被序列化,因此在序列化期間會忽略靜態成員字段。

因此,在反序列化過程中,靜態變量值的值將從類中加載。