Может ли сериализация Java десериализовать объекты как экземпляр родительского класса

У меня есть базовый класс, реализующий Serializable.

class Base implements Serializable { 
    ... //some fields
}

Также у меня есть еще один класс, расширяющий базовый класс.

class Another extends Base { 
    ... //some fields
}

У меня есть сериализованный экземпляр Another. Могу ли я десериализовать его как экземпляр Base?

Как вы их сериализуете и десериализуете?

muradm 30.10.2018 12:14

Да, вы можете сериализовать Access, а затем десериализовать как Base, но вы потеряете все данные, относящиеся к Access.

walen 30.10.2018 12:15

@LuisG. Я думаю, что в зависимости от метода / структуры сериализации / десериализации это изменится. Конечно, в соответствии с рассматриваемой иерархией вы можете десериализовать Another, а затем преобразовать его в класс Base. Но десериализация напрямую Base без использования Another обычно должна быть проблематичной, если это не json или какой-либо другой упрощенный формат.

muradm 30.10.2018 12:20

Вы можете использовать readResolve, если вам действительно нужен десериализованный экземпляр, чтобы иметь класс среды выполнения Base или любой другой класс. / Обычно классы должны быть либо abstract, либо фактически final.

Tom Hawtin - tackline 30.10.2018 15:09
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
668
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Да, в общем, можно.

Простейший пример игнорирования инициализации потока, закрытия, исключений и т. д.

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.

Другие вопросы по теме