如何反序列化对象?

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时,所有在开始时实例化的东西(如SeatingChart sc对象)是否都会获得文件中保存的任何内容,只要这些对象都实现了Serializable接口?如果是,那么为什么我的代码不起作用?我做错了什么?

定义“not working”。它代替做了什么? - trutheality
此外,最好的做法是拥有一个 private static final long serialVersionUID 字段。 - trutheality
它没有将序列化对象赋回。当我尝试打印乘客的姓名时,它不起作用。 - dave
2个回答

2

看起来您正在尝试通过引用参数返回值(是否具有C/C++背景?)

这在Java中是行不通的。所有参数(包括引用)都是按值传递的。一旦您这样做了,

sw101=null;

当你使用反序列化函数后,原本传入的对象的引用将会丢失。 你的反序列化函数应该返回航班对象。 (技术上讲,在Java中可以通过使用数组模拟通过参数返回,但这会导致代码不必要地复杂)

C编程是的,如果我只删除sw101 = null; <---- sw101仍然指向原始对象,对吗? - dave
当没有任何引用指向一个对象时,垃圾回收器会自动删除该对象,因此您无需显式地删除对象。 - trutheality

0
在Java中,所有参数都作为值传递..所以你最后一个问题的答案是否定的。sw101是对副本的引用。
正如所说,你必须返回你反序列化的对象才能使它工作。
请查看这篇文章:Java中的参数传递

我其实知道那个,但是复制还是指向了相同的对象。让我困惑的是我把从 C 语言经验中带来的将 sw101 赋值为 null。感谢您的帮助。 - dave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接