对象反序列化

文章来源:《Head First Java》修炼感悟。
上篇文章中,老白弄清楚了什么是对象序列化,也学会了如何把对象写入文件中。 本篇文章老白准备继续学习如何从文件中恢复对象,了解一下反序列化的过程中都发生了哪些事情。
一、恢复对象到保存时的状态
你可以从数据文件中把对象恢复到保存时的状态,恢复对象可以看作是序列化对象的反向过程。 反序列化可以分为五个基本步骤:
1.1、创建 FileInputStream
与序列化操作类似,创建文件输入流管道连接文件和上游对象,不同的是,字节流动方向是从文件流向上游对象。
FileInputStream fs = new FileInputStream("Save.ser");
注意,如果 Save.ser 文件不存在程序会抛出异常。
1.2、创建 ObjectInputStream
对象输入流用来连接文件输入流管道,需要提供下游输入对象 fs。
ObjectInputStream os = new ObjectInputStream(fs);
1.3、读取对象数据
从文件中读取序列化数据。
Object obj = os.readObject();
注意,每调用一次 readObject() 就能读取一个对象数据,读取顺序应按照保存时的顺序,对象个数也应该保持一致,否则就会抛出异常。
1.4、类型转换
从文件中恢复的对象类型为 Object,需要进行强制类型转换:
Swordsman sm = (Swordsman) obj;
1.5、关闭 ObjectInputStream
关闭对象输入流,同时文件输入流也随之关闭。
os.close();
二、反序列化的那些事
从文件中读取序列化数据后,Java 虚拟机会尝试在堆上创建对象,类加载器加载类和实例变量,但不会加载 transient 修饰的变量。
下面简单描述一下反序列化过程中都发生了哪些事情:
- 按字节方式从文件中读取对象数据;
- Java 虚拟机通过读取的数据信息判断 Class 类型;
- Java 虚拟机尝试寻找类并加载类,如果没有找到就会抛出异常;
- 恢复的对象被分配到堆中,但它的构造方法不会执行,因为本次操作不是为了新建对象而是为了恢复对象。
- 假如被恢复对象的继承树中存在不可序列化的父类,则第一个不可序列化的父类向上所有父类直至 Object 都会重新初始化。
- 恢复对象的实例变量会被还原到序列化时的值,而
transient修饰的变量会被赋值 null、0、0.0、false 等默认值。
| 《 上一篇 对象序列化 | 下一篇 保存 / 恢复对象状态 》 |
|---|
933

被折叠的 条评论
为什么被折叠?



