当前位置: 首页 > Thinking in Java > 正文

第 18 章 – java IO系统 – 序列化与反序列化

1. 反序列化时必须在classpath中能找到被序列化的类的class文件.

 

2. Serializable接口 和 transient关键字

   只有实现了Serializable接口的类的实例才能序列化. 

   这种类型的实例序列化时只存储当前对象的所有字段的二进制值.

   不会调用对象的默认构造器,所有对象的默认构造器可以不必是public的.

 

   使用transient关键字修饰的字段,在序列化时不会保存字段的值.

   transient关键字修饰的字段在反序列化时出来的值是未初始化的(数字0,或null之类的).

   示例代码:

 

3. Externalizable 接口集成自 Serializable接口  

   具有两个方法:

   void readExternal(ObjectInput in) 

          对象实现 readExternal 方法来恢复其内容,它通过调用 DataInput 

          的方法来恢复其基础类型,调用 readObject 来恢复对象、字符串和数组。 

   void writeExternal(ObjectOutput out) 

          该对象可实现 writeExternal 方法来保存其内容,

          它可以通过调用 DataOutput 的方法来保存其基本值,

          或调用 ObjectOutput 的 writeObject 方法来保存对象、

          字符串和数组。 

   这两个方法由系统调用.

   实现了Externalizable接口的对象在序列化时,先调用writeExternal(ObjectOutput out) 这个方法.

   传递的参数就是 用来写入序列化的ObjectOutputStream 对象,并将该对象传递给

   writeExternal方法.ObjectOutputStream对象实现了ObjectOutput接口(是DataOutput的子接口),

   该接口有各种类似writeInt等方法,还有writeObject方法可以在序列化时写入想要的保存的信息.

 

   readExternal(ObjectInput in)在反序列化时由系统自动调用.传入当前用来读取序列化文件的

   ObjectInputStream来读取序列化时writeExternal(ObjectOutput out)中写入的各种信息,并且

   用这些信息来初始化正在反序列化的对象.ObjectInputStream对象实现了ObjectInput接口(继承

   自DataInput接口,具有各种类似readInt等方法,还有readObject方法).

 

   在反序列化 Externalizable 对象时的所做的操作如下:

   (1) 先初始化字段,注意,transient 修饰的字段也会初始化

   (2) 如果有初始化块,则执行初始化块(不调用static修饰的静态初始化块)

   (3) 调用无参数的公共构造器(默认构造器)创建一个实例.

       因此,序列化的对象,必须要有public的默认构造器(无参构造器).

   (4) 调用 readExternal 方法进行初始化:通过从 ObjectInputStream 中读取 Serializable 对象

       可以恢复这些对象。

 

   所以,Externalizable序列化时是不会记录该对象的字段的,因为反序列化是依靠对象的默认构造器

   和readExternal(ObjectInput in)方法.

 

   比如下面的例子里面,class Blip2 implements Externalizable 没有public的默认构造器

   虽然在序列化时可以成功,但是反序列化时报异常:

   java.io.InvalidClassException: io.Blip2; io.Blip2; no valid constructor

 

   示例代码:

 

打个赏呗

   微信打赏  支付宝打赏


本文固定链接: https://www.jack-yin.com/coding/thinking-in-java/2053.html | 边城网事

该日志由 边城网事 于2015年03月02日发表在 Thinking in Java 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: 第 18 章 – java IO系统 – 序列化与反序列化 | 边城网事

第 18 章 – java IO系统 – 序列化与反序列化 暂无评论

发表评论

快捷键:Ctrl+Enter