一段示例数据:
魔数
前 4 个字节是固定的,表示这是通过 JDK 序列化的数据:
aced
STREAM_MAGIC, 声明使用了序列化协议0005
STREAM_VERSION, 声明 JDK 序列化协议的版本
序列化对象的类型信息
73
TC_OBJECT, 表示序列化的是一个 Java 对象72
TC_CLASSDESC, 表示后面是对象的类型信息000b
表示类名的长度,即 11 字节66 6f6f 2e62 6172 2e46 6f
接下来 11 字节是类名,即 “foo.bar.Foo”ff ffff ffff ffff ff
类名后的 8 字节是一个长整数,即 serialVersionUID = -1L02
SC_SERIALIZABLE 标识位,说明这个类实现了 Serializable 接口
对象的字段表
0002
表示这个对象中有 2 个属性49
即 I, 表示 int,说明这是一个 32 位整数00 03
表示属性名的长度,即 3 字节61 6765
即属性名 “age”4c
即 L, 表示引用类型,说明这个属性是某个类型的引用00 04
表示属性名的长度,即 4 字节6e 616d 65
即属性名 “name”74
TC_STRING 表示后面是个字符串0012
表示字符串长度,即 18 字节4c6a 6176 612f 6c61 6e67 2f53 7472 696e 673b
即 “Ljava/lang/String;“
父类信息
78
TC_ENDBLOCKDATA 表示这个数据块到此结束70
TC_NULL 表示这个类没有父类
如果有父类,则重复第二部分的结构,描述父类信息
对象的属性值
根据第三部分的字段表,可以知道该如何识别属性的值
- age, 根据字段表知道它是一个 32 位的整数
0000 000a
即 10
- name, 根据类型知道它是一个字符串
74
TC_STRING 表示后面是个字符串00 03
表示字符串长度为 374 6f6d
即 “tom”