引言
序列化是Java开发中不可或缺的一部分,对于大多数开发人员也是非常熟悉,使用频繁。在项目中的使用场景也很多,例如:数据持久化保持、项目内不同服务间通信、Redis缓存等。所以需要开发人员掌握这方面的知识,本文就实现Serializable接口,来进行解析序列化后的数据。
我们在将对象进行序列化后,会发现序列化后的对象文本跟类文本文件并不一样大,这是为什么呢?这是因为序列化后的文本存储方式不一样导致的。
正文
一、序列化算法一般步骤
- 将对象实例相关的类元数据输出。
- 递归地输出类的超类描述直到不再有超类。
- 类元数据完了以后,开始从最顶层的超类开始输出对象实例的实际数据值。
- 从上至下递归输出实例的数据
二、名词解释
直接类:开始输出直接被序列化的类(以下简称“直接类”,是相对于“直接类”的父类,和“直接类”中所包含的对象型属性的类而言)的描述
现在通过用二进制查看序列化后代码进行分析序列化后的数据。以下相关解释可以通过java.io.ObjectStreamConstants找到相关解释。
三、序列化后数据
四、相关数据解释
首先可以看到代码全部都是十六进制数据,接下来就一一解读相关意义(为什么依两个十六进制的数字为分隔,这个是因为两个十六进制最大刚好代表一个字节,方便解释)
五、数据结构解析(子类及父类)
AC ED:代表使用了序列化协议。
java.io.ObjectStreamConstants.STREAM_MAGIC 对应这个常量
00 05:代表序列化协议版本。
java.io.ObjectStreamConstants.STREAM_VERSION 对应这个常量
73:代表这是一个新