
Однако, если записать в поток ввода/вывода объект, реализующий интерфейс 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.