接下来算法就会输出超类也就是Parent类描述了,见颜色:
1. 0x72: TC_CLASSDESC. 声明这个是个新类.
2. 00 06: 类名长度.
3. 70 61 72 65 6E 74: parent,类名描述。
4. 0E DB D2 BD 85 EE 63 7A: SerialVersionUID, 序列化ID.
5. 0x02: 标记号. 该值声明该对象支持序列化.
6. 00 01: 类中域的个数.
下一步,输出parent类的域描述,int parentVersion=100;同见颜色:
1. 0x49: 域类型. 49 代表"I", 也就是Int.
2. 00 0D: 域名字长度.
3. 70 61 72 65 6E 74 56 65 72 73 69 6F 6E: parentVersion,域名字描述。
4. 0x78: TC_ENDBLOCKDATA,对象块结束的标志。
5. 0x70: TC_NULL, 说明没有其他超类的标志。.
到此为止,算法已经对所有的类的描述都做了输出。下一步就是把实例对象的实际值输出了。这时候是从parent Class的域开始的,见颜色:
1. 00 00 00 0A: 10, parentVersion域的值.
还有SerialTest类的域:
1. 00 00 00 42: 66, version域的值.
再往后的bytes比较有意思,算法需要描述contain类的信息,要记住,现在还没有对contain类进行过描述,见颜色:
1. 0x73: TC_OBJECT, 声明这是一个新的对象.
2. 0x72: TC_CLASSDESC声明这里开始一个新Class.
3. 00 07: 类名的长度.
4. 63 6F 6E 74 61 69 6E: contain,类名描述.
5. FC BB E6 0E FB CB 60 C7: SerialVersionUID, 序列化ID.
6. 0x02: Various flags. 标记号. 该值声明该对象支持序列化
7. 00 01: 类内的域个数。
输出contain的唯一的域描述,int containVersion=11;
1. 0x49: 域类型. 49 代表"I", 也就是Int..
2. 00 0E: 域名字长度.
3. 63 6F 6E 74 61 69 6E 56 65 72 73 69 6F 6E: containVersion, 域名字描述.
4. 0x78: TC_ENDBLOCKDATA对象块结束的标志.
这时,序列化算法会检查contain是否有超类,如果有的话会接着输出。
1. 0x70:TC_NULL,没有超类了。
最后,将contain类实际域值输出。
1. 00 00 00 0B: 11, containVersion的值.
OK,我们讨论了java序列化的机制和原理,希望能对同学们有所帮助。