2011-06-16 55 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