Чтение и запись объекта с несереализуемым родительским классом

Чтение и запись объекта с несереализуемым родительским классом

Если класс содержит ссылочные поля, указывающие на объекты, которые не реализуют интерфейс Serializable, то при попытке записать объект такого класса в поток вывода будет выброшено runtime-иcключение java.io.NotSerializableException.
Однако, если записать в поток ввода/вывода объект, реализующий интерфейс Serializable, родитель которого этот интерфейс не реализует, запись и чтение такого объекта пройдут успешно без потери информации.


class Animal {
    private String type = "animal";

    Animal() {
        System.out.printf("Constructor of %s\n", type);
    }

    String getType() {
        return type;
    }
}


class Tiger extends Animal implements Serializable {
    String species = "tiger";

    Tiger() {
        System.out.printf("Constructor of %s\n\n", species);
    }
}


FileOutputStream fos = new FileOutputStream(new File("myFile.txt"));
ObjectOutputStream oos = new ObjectOutputStream(fos);
FileInputStream fis = new FileInputStream("myFile.txt");
ObjectInputStream ois = new ObjectInputStream(fis);

System.out.println("Writing tiger...");
Tiger tiger = new Tiger();
oos.writeObject(tiger);
        
System.out.println("Reading tiger...");
tiger = (Tiger) ois.readObject();

System.out.printf("Species of %s: %s\n", tiger.getType(), tiger.species);
oos.close(); fos.close(); ois.close(); fis.close();
Вывод:


/*
Writing tiger...
Constructor of animal
Constructor of tiger

Reading tiger...
Constructor of animal
Species of animal: tiger
*/
При десереализации объекта его конструктор не вызывается. Но по цепочке вызываются конструкторы без параметров всех его родителей. Если у кого-либо из родителей такого конструктора нет, то при десереализации вылетит исключение java.io.InvalidClassException.
Потоки ввода/вывода