Есть код:
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". Почему этого не происходит?
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ