У меня есть базовый класс, реализующий Serializable
.
class Base implements Serializable {
... //some fields
}
Также у меня есть еще один класс, расширяющий базовый класс.
class Another extends Base {
... //some fields
}
У меня есть сериализованный экземпляр Another
. Могу ли я десериализовать его как экземпляр Base
?
Да, вы можете сериализовать Access
, а затем десериализовать как Base
, но вы потеряете все данные, относящиеся к Access
.
@LuisG. Я думаю, что в зависимости от метода / структуры сериализации / десериализации это изменится. Конечно, в соответствии с рассматриваемой иерархией вы можете десериализовать Another
, а затем преобразовать его в класс Base
. Но десериализация напрямую Base
без использования Another
обычно должна быть проблематичной, если это не json
или какой-либо другой упрощенный формат.
Вы можете использовать readResolve
, если вам действительно нужен десериализованный экземпляр, чтобы иметь класс среды выполнения Base
или любой другой класс. / Обычно классы должны быть либо abstract
, либо фактически final
.
Да, в общем, можно.
Простейший пример игнорирования инициализации потока, закрытия, исключений и т. д.
class Base implements Serializable {
String a;
Base(String a) { this.a = a; }
}
class Access extends Base {
String b;
Base(String a, String b) { super(a); this.b = b; }
}
class Test {
public static void main(String[] args) {
Access access = new Access("string1", "string2");
// Serialization
ObjectOutputStream out = new ObjectOutputStream(...);
out.writeObject(access);
// Deserialization
ObjectInputStream in = new ObjectInputStream(...);
Base base = (Base) in.readObject();
System.out.println("Base.a = " + base.a); // ok, prints "string1"
// System.out.println("Access.b = " + base.b); // -> compilation error -- this is not an Access object; "string2" has not been deserialized.
}
}
Однако для этого нет особых причин. Вы всегда можете десериализовать как Access
, чтобы получить все данные, а затем при необходимости преобразовать в Base
.
Как вы их сериализуете и десериализуете?