2011-06-16 87 views
3

我有一個類叫做Flight Flight類在實例化時,實例化另一個名爲SeatingChart的類,而SeatingChart也實例化另一個類等等等等。如何反序列化對象?

public class Flight implements Serializable 
{ 

    SeatingChart sc = new SeatingChart(); seating 
    //WaitingList wl = new WaitingList(); 
} 

public class SeatingChart extends ListAndChart implements PassengerList, Serializable 
{ 
    public static final int NOT_FOUND = 42; 

    Passenger [] pass = new Passenger[40]; 
} 

public class Passenger implements Serializable 
{ 

    private String firstName, lastName, fullName; 

    public String getName() 
    { 
     fullName = firstName + " " + lastName; 
     return fullName; 
    } 
    public void setFirstName(String firstName) 
    { 
     this.firstName = firstName; 
    } 
    public void setLastName(String lastName) 
    { 
     this.lastName = lastName; 
    } 
} 

我在另一個類的另一種方法是反序列化保存在磁盤中的對象

public void actionPerformed(ActionEvent evt) 
      { 
       Serialization.deserialize(sw101); <--- sw101 is a Flight object 
       . 
       . 
       . 
      } 

//code for deserialization 
public static void deserialize(Flight sw101) 
    { 
     String filename = "serialized.ser"; 

     sw101 = null; 

     FileInputStream fis = null; 
     ObjectInputStream in = null; 

     try 
     { 
      fis = new FileInputStream(filename); 
      in = new ObjectInputStream(fis); 
      sw101 = (Flight)in.readObject(); 
      System.out.println("sw101" + sw101.toString()); 
      in.close(); 
     } 
     catch(IOException ex) 
     { 
      ex.printStackTrace(); 
     } 
     catch(ClassNotFoundException ex) 
     { 
      ex.printStackTrace(); 
     } 
    } 

我的問題是,當我分配SW101序列化的對象,一切SW101在開始實例像SeatingChart SC如果這些對象都實現了Serializable接口,那麼對象也可以獲取文件中保存的任何內容,而無需執行任何操作。如果是這樣,爲什麼我的代碼不工作?我究竟做錯了什麼?

+0

定義... 「不工作」。它做什麼呢? – trutheality 2011-06-16 23:49:07

+0

另外,最好有一個「私有靜態最終的long serialVersionUID」字段。 – trutheality 2011-06-16 23:51:51

+0

它不會返回序列化對象。當我嘗試打印乘客的名字時,它不起作用。 – dave 2011-06-16 23:51:55

回答

2

它看起來像你想通過引用參數(C/C++背景是什麼?)

這永遠不會奏效在Java中返回。所有參數(包括引用)都是按值傳遞的。一旦你這樣做

sw101=null; 

你就失去了參照中傳遞的對象。

deserialize功能應該返回,而不是飛行物體。

(技術上有模擬通過使用陣列通過在Java中的參數返回的方式,但它會導致不必要的複雜代碼)

+0

c編程是的,如果我只是刪除sw101 = null; <---- sw101仍然是指原始對象的權利? – dave 2011-06-17 00:06:22

+0

當沒有更多的對垃圾回收器刪除的對象的引用時,您不必顯式刪除對象。 – trutheality 2011-06-17 00:11:08

+0

非常感謝你的工作 – dave 2011-06-17 00:11:13

0

在java中,所有參數都作爲值傳遞..所以答案你最後的問題是否定的。 sw101是對副本的引用。

如上所述,您必須返回反序列化的對象才能使其工作。

檢查這篇文章:parameter passing in java

+0

我確實知道,但副本仍然指的是同一個對象是什麼讓我是我分配給sw101,我從我的c經驗進行了零。謝謝您的幫助 – dave 2011-06-17 00:25:02