序列化与反序列化知识点总结
-
什么是序列化和反序列化:
- 序列化:将实例化对象中的数据变成字节码,用于存储或进行网络传输
- 反序列化:反序列化就是将存储着实例化对象的文档从计算机硬盘通过字节流的输入进行读取,最终还原成实例化对象中的数据
-
序列化时可以将多个对象存储至一个文档,对应的反序列化时可以将多个对象从一个文档中进行读取
-
被序列化的对象可以是Java提供的类,也可以是自定义创建的类,但该类必须直接或间接实现Serializable接口,否则不能被序列化
需要注意的是:
-
在进行序列化之后,若对被序列化对象的类进行修改,则反序列化时会出现异常(因为序列化操作和反序列化操作的序列化版本ID不一致),若仍要对原序列化的版本进行反序列化操作,则要手动生成原版本的序列化版本ID(一般在进行序列化和反序列化时都必须手动生成序列化版本ID)
-
在进行序列化和反序列化操作时,若需要屏蔽某个属性变量,有两种方式:
① 在定义该属性变量类型的前面加上transient关键字
② 当前类实现序列化接口Externalizable(该接口仍继承自序列化接口Serializable接口),并且实现该序列化接口中的序列化方法writeExternal()和反序列化方法readExternal(),不需要屏蔽的属性变量都加入两个方法中
- Serializable接口和Externalizable接口之间的联系和区别
联系:Externalizable接口继承自Serializable接口,前者是后者的子接口
区别:
-
当前类若实现Serializable接口,在进行序列化和反序列化时,直接对当前序列
化版本ID类中的所有属性变量进行操作,并且必须手动生成序列化版本ID
-
当前类若实现Externalizable接口,因为Externalizable接口中扩展了序列化方法writeExternal()和反序列化方法readExternal(),在进行序列化和反序列化时,需要在当前类中实现这两个抽象方法,并且方法中要加入序列化和反序列化的属性变量,没有加入的属性变量会进行屏蔽,不需要序列化版本ID