Доброе утро. Разбираю тему сериализации и в одной статье(ссылку оставлю ниже) наткнулся на такое утверждение:
"То есть при десериализации вызывается конструктор без параметров родительского НЕсериализуемого класса".
И собственно вопрос, а что происходит при вызове конструктора без параметров? Вот есть код:
1. Родительский класс Animal, несериализуемый
public class Animal {
public String name;
public int age;
public String kind;
public Animal(String name, int age, String kind) {
System.out.println("Parent constructor");
this.name = name;
this.age = age;
this.kind = kind;
}
public Animal() {
}
}
2. Класс-потомок Cat, сериализуемый
public class Cat extends Animal implements Serializable {
String bread;
public Cat(String name, int age, String kind, String bread) {
super(name, age, kind);
this.bread = bread;
System.out.println("Child constructor");
}
@Override
public String toString() {
return "Cat{" +
"bread='" + bread + '\'' +
", name='" + name + '\'' +
", age=" + age +
", kind='" + kind + '\'' +
'}';
}
}
3. Метод main
public static void main(String[] args) throws IOException {
// сериализация кота барсика
try (FileOutputStream outputStream = new FileOutputStream("C:\\Users\\Admin\\Documents\\code.txt")) {
ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
Cat barsik = new Cat("Barsik", 3, "cat", "may-cun");
objectOutputStream.writeObject(barsik);
}
// десериализация барсика
try (FileInputStream inputStream = new FileInputStream("C:\\Users\\Admin\\Documents\\code.txt")) {
ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
Cat loadedBarsik = (Cat) objectInputStream.readObject();
System.out.println(loadedBarsik);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
И что происходит при
Cat loadedBarsik = (Cat) objectInputStream.readObject();
Ведь именно тогда вызывается конструктор родителя без параметров, верно? Так же я знаю, что при использовании Serializable выделяется память под объект, при этом его конструктор не вызывается. И получается что-то типо:
Object o = new Object(); // и сейчас мы используем нисходящее преобразование до Cat
Cat loadedBarsik = (Cat) o;
Но причем здесь конструктор родителя без параметров, смысл его вызывать?
P. S. ссылка на статью