В конце концов, это разные классы. Во время сериализации процесс должен будет отслеживать его тип, потому что во время десериализации среде выполнения необходимо знать, какой тип создать. Когда типы не совпадают, вы получите исключение приведения класса.
Однако вы должны изучить метод readResolve()
, который будет вызываться во время десериализации и который вы можете использовать для создания другого типа из потока. Если бы вы добавили следующий метод в ваш класс A, десериализация сработала бы:
public Object readResolve() throws ObjectStreamException{
return new B();
}
Из Javadocs в интерфейсе Serializable:
* Serializable classes that need to designate an alternative object to be
* used when writing an object to the stream should implement this
* special method with the exact signature:
*
*
* ANY-ACCESS-MODIFIER Object writeReplace() throws ObjectStreamException;
*
*
* Этот метод writeReplace вызывается сериализацией, если метод
* существует и будет доступен из метода, определенного в
* класс сериализуемого объекта. Таким образом, метод может быть закрытым,
* защищенный и пакетно-приватный доступ. Подкласс доступа к этому методу
* следует правилам доступности Java.
*
* Классы, которые должны назначить замену, когда экземпляр этого
* читается из потока должен реализовать этот специальный метод с
* точная подпись.
*
*
* ANY-ACCESS-MODIFIER Object readResolve() throws ObjectStreamException;
*
*
* Этот метод readResolve следует тем же правилам вызова и
* правила доступности как writeReplace.