在本文中,我们关注对象序列化。
首先我们来讨论什么是序列化,序列化的原理。然后给出一个简单的例子来演示序列化和反序列化。有时候有些信息不应该序列化,应该如何控制?我们如何定制序列化内容?最后,我们讨论了在继承结构的场景中序列化应该注意什么。
序列化概述
序列化,简单来说就是用“流”的方式保存对象。至于保存的目的地址,可以是文件,也可以是数据库,也可以是网络,就是通过网络把对象从一个节点转移到另一个节点。
我们知道在Java的I/O结构中,有ObjectOutputStream和ObjectInputStream,它们可以将对象作为二进制流输出,并从二进制流中获取对象,那么为什么需要序列化呢?这需要从Java变量的存储结构入手。我们知道,对于Java来说,基本类型存储在堆栈中,复杂类型(引用类型)存储在堆中。对于基本类型,上面的操作是可行的,但是对于复杂类型,上面的操作可能会产生重复的对象,导致错误。
序列化的工作流程如下:
1)通过输出流保存的所有对象都有唯一的序列号。
2)当需要保存一个对象时,先检查其序号。
3)当保存的对象已经包含序列号时,不需要再次保存,否则进入正常保存过程。
正是通过序列号机制,序列化才能完整准确地保存一个对象的各个状态。
序列化保存对象中各种属性值,而不是方法或方法签名等信息。至于方法或者方法签名,只要JVM能找到正确的ClassLoader,就可以调用该方法。
序列化不保存类的静态变量,因为静态变量作用于类型,而序列化作用于对象。
简单的序列化示例
序列化的整个过程由两部分组成: