Страницы

Поиск по вопросам

среда, 22 января 2020 г.

Вопрос по сериализации объектов в java

#java #исключения #наследование #сериализация #десериализация


Есть классы, расположенные в определённой иерархии наследования:

public class Program {
    public Program(){
        System.out.println("Текст");
    }
}

public class Wild extends Program{
    public Wild(){
        System.out.println("НеТекст");
    }
}

public class BasicProgramists extends Wild{
    public BasicProgramists(){
        System.out.println("Бесполезная программа");
    }
}

import java.io.*;

public class BasicUser extends BasicProgramists implements Serializable {
    public BasicUser(){
        System.out.println("Использование бесполезной программы");
    }

    public static void main(String[] args) {
        BasicUser user = new BasicUser();
        System.out.println();
        try {
            ObjectOutputStream or = new ObjectOutputStream(new FileOutputStream("Progg.ser"));
            or.writeObject(user);
            or.close();
        }
        catch (IOException ex){
            ex.printStackTrace();
        }

        try {
            ObjectInputStream is = new ObjectInputStream(new FileInputStream("Progg.ser"));
            BasicUser user1 = (BasicUser) is.readObject();
        }
        catch (Exception ex){
            ex.printStackTrace();
        }
    }
}


После компиляции получаем вот такой результат:


До отступа - результат работы конструктора BasicUser

После отступа - результат работы десериализации

Скажите, пожалуйста, почему в результате десириализации, программа не выводит на
экран результат работы конструктора BasicUser, хотя выводит результат работы всех родительских
классов?
    


Ответы

Ответ 1



Сериализация в java не использует конструкторы для создания объектов. Поэтому контруктор не был вызван. Но почему вызвались кострукторы родительских классов? Очевидно, т.к. они не реализовали Serializable, то механизм сериализации о них ничего не знал и поэтому инициализация происходила обычным способом - через конструктор. В сказаном легко убедиться реализовав Serializable классом Program.

Ответ 2



В дополнение к предыдущему ответу Если нужно, чтобы все конструкторы отрабатывали Немного допилил ваш код import java.io.*; class Program { Program() { System.out.println("Текст"); } } class Wild extends Program { Wild() { System.out.println("НеТекст"); } } class BasicProgrammers extends Wild { BasicProgrammers() { System.out.println("Бесполезная программа"); } } class BasicUser extends BasicProgrammers { BasicUser() { System.out.println("Использование бесполезной программы"); } } class SuperUser extends BasicUser implements Serializable { public static void main(String[] args) { SuperUser superUser = new SuperUser(); System.out.println(); try { ObjectOutputStream or = new ObjectOutputStream(new FileOutputStream("Progg.ser")); or.writeObject(superUser); or.close(); } catch (IOException ex) { ex.printStackTrace(); } try { ObjectInputStream is = new ObjectInputStream(new FileInputStream("Progg.ser")); SuperUser superUser1 = (SuperUser) is.readObject(); } catch (Exception ex) { ex.printStackTrace(); } } } Вывод: // Текст // НеТекст // Бесполезная программа // Использование бесполезной программы // // Текст // НеТекст // Бесполезная программа // Использование бесполезной программы // // Process finished with exit code 0

Комментариев нет:

Отправить комментарий