Загрузка сериализованного объекта - PullRequest
0 голосов
/ 09 сентября 2018

Я начинаю 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 голосов
/ 09 сентября 2018

Вы не можете вызвать метод экземпляра для экземпляра, который еще не существует. Даже если ваш код может скомпилироваться, вы получите 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(), потому что это безопаснее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...