JavaRush /Java блог /Архив info.javarush /Загадка сериализации
RSeropyan
25 уровень
Санкт-Петербург

Загадка сериализации

Статья из группы Архив info.javarush
Есть код: package app; import java.io.*; public class Solution { public static void main(String[] args) throws Exception{ B b1 = new B(); File file = new File("D:\\test.txt"); OutputStream os = new FileOutputStream(file); ObjectOutputStream oos = new ObjectOutputStream(os); oos.writeObject(b1); oos.close(); os.close(); InputStream is = new FileInputStream(file); ObjectInputStream ois = new ObjectInputStream(is); System.out.println("Before serialization: " + b1.str); b1 = (B) ois.readObject(); System.out.println("After de-serialization: " + b1.str); ois.close(); os.close(); } } class A{ protected String str = "A"; } class B extends A implements Serializable{ public B() { this.str += "B"; } } Вывод в консоль: Before serialization: AB After de-serialization: A Мат.часть по ссылке http://www.skipy.ru/technics/serialization.html говорит следующее:
При использовании Serializable десериализация происходит так: под объект выделяется память, после чего его поля заполняются значениями из потока. Конструктор объекта при этом не вызывается.
и следующее:
То есть при десериализации вызывается конструктор без параметров родительского НЕсериализуемого класса. Конструктор же дочернего объекта, того, который мы десериализуем, не вызывается.
Если смотреть код, то логика такова: 1. Сериализуем объект b1 класса B. 2. К моменту его сериализации b1.str = "AB", соответственно в выходной поток пишется именно это состояние объекта. 3. При десериализации (если следовать теории) должно происходить следующее: - Под объект b1 выделяется память - Вызывается конструктор без параметров родительского класса. При этом, как я предполагаю, поля объекта b1 инициализируются либо значениями, определенными в классе-родителе, либо значениями по умолчанию. Видимо так и происходит, поэтому b1.str становится = "А" - И вот тут по теории поля b1 уже должны заполнятся реальными значениями из потока, т.е. b1.str должно стать = "AB". Почему этого не происходит?
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ