【老白学 Java】对象反序列化

对象反序列化

码老白
文章来源:《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 修饰的变量。

下面简单描述一下反序列化过程中都发生了哪些事情:

  1. 按字节方式从文件中读取对象数据;
  2. Java 虚拟机通过读取的数据信息判断 Class 类型;
  3. Java 虚拟机尝试寻找类并加载类,如果没有找到就会抛出异常;
  4. 恢复的对象被分配到堆中,但它的构造方法不会执行,因为本次操作不是为了新建对象而是为了恢复对象。
  5. 假如被恢复对象的继承树中存在不可序列化的父类,则第一个不可序列化的父类向上所有父类直至 Object 都会重新初始化。
  6. 恢复对象的实例变量会被还原到序列化时的值,而 transient 修饰的变量会被赋值 null、0、0.0、false 等默认值。


《 上一篇 对象序列化下一篇 保存 / 恢复对象状态 》
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值