Я читаю серию сериализации в "Эффективной Java". Я пытаюсь понять нижеследующий абзац в книге.
Если вы реализуете класс с полями экземпляров, которые сериализуются и расширяемость, есть предостережение, о котором вы должны знать. Если класс имеет инварианты, которые будут нарушены, если его поля экземпляра мы инициализируются значениями по умолчанию (ноль для интегральных типов, false для boolean и null для типов ссылок объектов), вы должен добавить этот метод readObjectNoData для класса:
// readObjectNoData for stateful extendable serializable classes
private void readObjectNoData() throws InvalidObjectException {
throw new InvalidObjectException("Stream data required");
}
Я не уверен, что означает вышеуказанное положение.
Чтобы проверить это, я создал класс Person (как сериализуемый, так и расширяемый)
class Person implements Serializable{
private String name;
private int age;
Person() {
this("default",1);
}
Person(String name, int y) {
this.name = name;
this.age = y;
}
}
и класс Employee, который расширяет его.
class Employee extends Person {
String address ;
public Employee()
{
super();
address ="default_address";
}
public Employee(String name , int age, String address)
{
super(name,age);
this.address = address;
}
}
Существуют ли какие-либо инварианты в классе Person, которые я создал? Когда они будут нарушены? Я скопировал код для метода readObjectData() в классе Employee, но он так и не был вызван. Когда будет вызван метод readObject()? Я что-то пропустил?