2014-01-30 43 views
1

我試圖理解反序列化如何與上面的例子一樣:在java中的反序列化過程中如何使用字段值?

class A implements Serializable{ 
     int x=3; 
     long y=4; 
     short z=5; 
    } 

    public class B extends A{ 
     public B(){ 
      x=7; 
     } 

     public String toString(){ 
      return ""+x+""+y+""+z; 
     } 
     public static void main(String[] args) { 
      B b=new B(); 
    try{ 
       FileOutputStream fos=new FileOutputStream("ser.ser"); 
       ObjectOutputStream oos=new ObjectOutputStream(fos); 
       oos.writeObject(b); 
       oos.close(); 
       System.out.println(b); 
       FileInputStream fis=new FileInputStream("ser.ser"); 
       ObjectInputStream ois=new ObjectInputStream(fis); 
       b=(B)ois.readObject(); 
       ois.close(); 
       System.out.println(b); 
      } 
      catch(Exception e){ 
       e.printStackTrace(); 
      } 
} 
} 

這是產生745但是,當我implement serializable in B類的結果是345

我不能夠理解的差異系列化B類正在製作...

+0

你說的是反序列化的情況嗎?如果是,那麼你可以添加序列化和反序列化的代碼嗎? –

+0

是的,謝謝...... – Rajesh

回答

3

當您反序列化一個對象時,對於層次結構中沒有實現接口的所有類,調用構造函數以初始化t中的狀態帽類。

所以,當您B類未實現Serializable,構造函數運行,並分配到7x,因此你會得到745。但是,如果它實現了Serializable,則不會發生這種情況,並且x的值將是該對象序列化時的值,即在此情況下爲3

+0

@AlexR我猜他在談論反序列化後的輸出,因爲他得到了'345'。我仍然要求澄清,讓我們看看。會相應更新。 –

+0

我不明白當'new B()'執行時類'B'的構造函數沒有運行。請注意,'B'類不能被編譯,因爲看起來像構造函數的東西被稱爲'Puppy'。我相信,OP試圖對他的代碼進行一些修改的幾個版本,然後發送到這裏根本無法編譯的版本,所以他的問題是不相關的。 – AlexR

+0

@AlexR哦,親愛的。沒有注意到。 –

相關問題