Валидатор принял решение. И оно близко к "правильному".
Но при этом что "правильное" решение, что мое при запуске в Идее стабильно выдает
Exception in thread "main" java.io.InvalidClassException: Animal; local class name incompatible with stream class name "OldAnimal"
аналогично со следующим заданием: JAVA 25 SELF, 45 уровень, 3 лекция
Обновление профилей пользователей: интеллектуальная миграция возраста
тот же ИнвалидКлассЕксепшн и та же несовместимость классов
куда копать и в чем может быть причина?
суть: есть старый класс. его пишут в файл, а потом добавляют в него новое поле и читают как новый класс
OldAnimal zebraV1 = new OldAnimal("Зебра", 350);
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("animal.dat"))) {
oos.writeObject(zebraV1); // сохраняем старую версию объекта
}
// 2) "Вторая версия" класса Animal: добавлено поле animalColor, serialVersionUID не меняем.
// Десериализуем старый файл. При чтении маппим OldAnimal -> Animal.
Animal loaded = null;
try (ObjectInputStream ois = new CustomObjectInputStream(new FileInputStream("animal.dat"))) {
Object obj = ois.readObject();
if(obj instanceof Animal){
loaded = (Animal) obj;
}
}
public class CustomObjectInputStream extends ObjectInputStream {
public CustomObjectInputStream(FileInputStream fileInputStream) throws IOException {
super(fileInputStream);
}
@Override
protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException {
if (desc.getName().equals(OldAnimal.class.getName())) {
return Animal.class;
}
return super.resolveClass(desc);
}
}