快速业务通道

Java序列化的机制和原理 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-25
 { int version = 66; contain con = new contain(); public int getVersion() { return version; } public static void main(String args[]) throws IOException { FileOutputStream fos = new FileOutputStream("temp.out"); ObjectOutputStream oos = new ObjectOutputStream(fos); SerialTest st = new SerialTest(); oos.writeObject(st); oos.flush(); oos.close(); } }

Java序列化的机制和原理(4)

时间:2009-11-12 longdick''s blog

这个例子是相当的直白啦。SerialTest类实现了Parent超类,内部还持有一个Container对象。

序列化后的格式如下:

AC ED 00 05 73 72 00 0A 53 65 72 69 61 6C 54 65

73 74 05 52 81 5A AC 66 02 F6 02 00 02 49 00 07

76 65 72 73 69 6F 6E 4C 00 03 63 6F 6E 74 00 09

4C 63 6F 6E 74 61 69 6E 3B 78 72 00 06 70 61 72

65 6E 74 0E DB D2 BD 85 EE 63 7A 02 00 01 49 00

0D 70 61 72 65 6E 74 56 65 72 73 69 6F 6E 78 70

00 00 00 0A 00 00 00 42 73 72 00 07 63 6F 6E 74

61 69 6E FC BB E6 0E FB CB 60 C7 02 00 01 49 00

0E 63 6F 6E 74 61 69 6E 56 65 72 73 69 6F 6E 78

70 00 00 00 0B

我们来仔细看看这些字节都代表了啥。开头部分,见颜色:

AC ED: STREAM_MAGIC. 声明使用了序列化协议.

00 05: STREAM_VERSION. 序列化协议版本.

0x73: TC_OBJECT. 声明这是一个新的对象.

序列化算法的第一步就是输出对象相关类的描述。例子所示对象为SerialTest类实例,因此接下来输出SerialTest类的描述。见颜色:

0x72: TC_CLASSDESC. 声明这里开始一个新Class。

00 0A: Class名字的长度.

53 65 72 69 61 6c 54 65 73 74: SerialTest,Class类名.

05 52 81 5A AC 66 02 F6: SerialVersionUID, 序列化ID,如果没有指定,则会由算法随机生成一个8byte的ID.

0x02: 标记号. 该值声明该对象支持序列化。

00 02: 该类所包含的域个数。

接下来,算法输出其中的一个域,int version=66;见颜色:

0x49: 域类型. 49 代表"I", 也就是Int.

00 07: 域名字的长度.

76 65 72 73 69 6F 6E: version,域名字描述.

然后,算法输出下一个域,contain con = new contain();这个有点特殊,是个对象。描述对象类型引用时需要使用JVM的标准对象签名表示法,见颜色:

0x4C: 域的类型.

00 03: 域名字长度.

63 6F 6E: 域名字描述,con

0x74: TC_STRING. 代表一个new String.用String来引用对象。

00 09: 该String长度.

4C 63 6F 6E 74 61 69 6E 3B: Lcontain;, JVM的标准对象签名表示法.

0x78: TC_ENDBLOCKDATA,对象数据块结束的标志

.接下来算法就会输出超类也就是Parent类描述了,见颜色:

0x72: TC_CLASSDESC. 声明这个是个新类.

00 06: 类名长度.

70 61 72 65 6E 74: parent,类名描述。

0E DB D2 BD 85 EE 63 7A: SerialVersionUID, 序列化ID.

0x02: 标记号. 该值声明该对象支持序列化.

00 01: 类中域的个数.

下一步,输出parent类的域描述,int parentVersion=100;同见颜色:

0x49: 域类型. 49 代表"I", 也就是Int.

00 0D: 域名字长度.

70 61 72 65 6E 74 56 65 72 73 69 6F 6E: parentVersion,域名字描述。

0x78: TC_ENDBLOCKDATA,对象块结束的标志。

0x70: TC_NULL, 说明没有其他超类的标志。.

Java序列化的机制和原理(5)

时间:2009-11-12 longdick''s blog

到此为止,算法已经对所有的类的描述都做了输出。下一步就是把实例对象的实际值输出了。这时候是从parent Class的域开始的,见颜色:

00 00 00 0A: 10, parentVersion域的值.

还有SerialTe

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号