如何反序列化对象?

时间:2011-06-16 23:46:18

标签: java serialization

我有一个名为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接口,我就可以获取文件中保存的内容而不做任何事情?如果是这样,为什么我的代码不起作用?我做错了什么?

2 个答案:

答案 0 :(得分:2)

看起来你正试图通过参考参数(C / C ++背景?)

返回

这在Java中无效。所有参数(包括引用)都按值传递。一旦你做了

sw101=null;

您将丢失对传入的对象的引用。

您的deserialize功能应返回航班对象。

(从技术上讲,有一种方法可以模拟通过使用数组返回Java中的参数,但会导致不必要的复杂代码)

答案 1 :(得分:0)

在java中,所有参数都作为值传递..所以你上一个问题的答案是否定的。 sw101是对副本的引用。

如上所述,您必须返回反序列化的对象才能使其正常工作。

查看此文章:parameter passing in java