简体   繁体   中英

Loading serialized object

I am beginning java, and started to play with serialization. I wonder if there is any way to write the deserialization function inside the class itself. Let me clarify what I mean: I can deserialize an object (ie from class Person ) from within another class and it works:

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 (...) { ... }
     }
 }

But, for being tidy, is it possible to move this inside the Person class as a function? For instance, to do something like this:

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 (...) { ... }
     }
}

And then in the other class just call this:

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

You can't call an instance method on an instance that doesn't exist yet. Even if your code could compile, you would get a NullPointerException because youùre calling a method on null .

Make your method static and make it return the deserialized instance. More generally, this is not a variable that you can assign, it's an immutable reference to an object.

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: I also added try-catch with resources instead of explicit close() because it's safer.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM