加载序列化对象

时间:2018-09-09 19:54:49

标签: java serialization

我开始使用Java,并开始使用序列化。我想知道是否有任何方法可以在类本身内编写反序列化函数。让我澄清一下我的意思:我可以从另一个类中反序列化一个对象(即来自类Person的对象),并且可以正常工作:

public class Dummy{
    ...
    public static void main(String args[])
    {
        ...
        Person father = null;
        try {
            FileInputStream load = new FileInputStream(saved_file);
            ObjectInputStream in = new ObjectInputStream(load);
            indiv = (Person) in.readObject();
            in.close();
            load.close();
        } catch (...) { ... }
     }
 }

但是,为了保持整洁,是否可以将其作为函数移到Person类中?例如,要做这样的事情:

public class Person implements Serializable {

    private boolean isOrphan = false;
    private Person parent;
    ...

    public void load(File saved_file) {
        try {
            FileInputStream load = new FileInputStream(saved_file);
            ObjectInputStream in = new ObjectInputStream(load);
            this = (Person) in.readObject(); // Error: cannot assign a value to final variabl this
            in.close();
            load.close();
         } catch (...) { ... }
     }
}

然后在另一个类中只需调用此:

public class Dummy{
    ...
    public static void main(String args[])
    {
        ...
        Person father = null;
        father.load(saved_file);
    }
}

1 个答案:

答案 0 :(得分:3)

您不能在尚不存在的实例上调用实例方法。即使您的代码可以编译,您也会得到NullPointerException,因为您在null上调用了一个方法。

使您的方法静态,并使其返回反序列化的实例。通常,this不是您可以分配的变量,它是对对象的不变引用。

public static Person load(File saved_file) {
    try (FileInputStream load = new FileInputStream(saved_file);
         ObjectInputStream in = new ObjectInputStream(load)) {
        return (Person) in.readObject();
     } catch (...) { ... }
 }

public class Dummy {
    public static void main(String args[]) {
        Person father = Person.load(saved_file);
    }
}

PS:我还添加了带有资源的 try-catch 而不是显式的close(),因为它更安全。