2012-11-26 41 views
0

,我讀了「序列化不是靜態元素」 - 但低於一個簡單的例子告訴我,否則。靜態成員系列化

class superparent implements Serializable { 
    int data = 0; 

    public superparent(int data) { 
     this.data = data; 
    } 

    public int getdata() { 
     return data; 
    } 
} 

public class statichost implements Serializable { 
    int member = 0; 
    public static superparent s = new superparent(20); 

    public statichost(int data) { 
     this.member = data; 
    } 

    public static void main(String[] args) { 
     statichost c = new statichost(6); 
     try { 
      FileOutputStream fs = new FileOutputStream("testSer.ser"); 
      ObjectOutputStream os = new ObjectOutputStream(fs); 
      os.writeObject(c); 
      os.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     try { 
      FileInputStream fis = new FileInputStream("testSer.ser"); 
      ObjectInputStream ois = new ObjectInputStream(fis); 
      c = (statichost) ois.readObject(); 
      ois.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     System.out.println("after: contained data is " + c.s.getdata()); 
    } 
} 

當我按照上面的說法期望0時,輸出打印20。 我錯過了什麼嗎?

回答

0

我覺得你的測試代碼無法驗證這種情況。 因爲20在類初始化中由public static superparent s=new superparent(20);設置,所以在類加載時它總是由JVM設置爲20。

如果你想在初始數據爲0,並檢查數據的修改,以20不能序列,然後嘗試

  1. 使用public static superparent s=new superparent(0);,而不是20的初始值。
  2. 爲第一次執行註釋掉readObject try-catch塊,並在第一個try-catch塊中添加修改代碼c.s.data = 20並寫入文件,然後執行代碼。
  3. 註釋掉第二個執行的writeObject try-catch塊,並再次執行讀取對象 代碼。然後你可以看到20不能被序列化成文件,打印0。
+0

恭喜OP接受你的答案,這是我自己的單詞副本的近乎單詞! – Perception

+1

看起來你的一個更通用,更好,但我沒有讀你回答我發佈我的。對不起,沒有人想複製其他人的愚蠢答案... – Kleenestar

2

這是因爲你的int data=0;不是你superparent類的靜態成員。

此外,我想指出的是類名應以大寫字母開頭,如果你已經忘記了這個建議

+0

的問題是關於序列化靜態「superparent」成員,而不是「數據」構件。 –

2

即使世界沒什麼特別的事情在這裏。你已經爲你的類statichost聲明瞭一個靜態成員變量。這個變量在JVM加載類時被初始化,而不管觸發何種類的加載。

序列化和反序列化statichost實例對靜態字段沒有影響,因爲它們與你的類相關聯,而不是與您的實例。如果你想測試,打出來的序列化和反序列化到不同的塊並執行以下步驟:

  • 系列化你statichost實例
  • 更改類,以便superparent與15初始化,而不是20
  • 反序列化statichost實例

如果靜態字段是序列化,你會期望c.s.getdata()報告20,但它會報告15.