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

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

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

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

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

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

1 Ответ

0 голосов
/ 30 октября 2018

Да, в общем, вы можете сделать это.

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

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...