`
nanapoleon
  • 浏览: 46803 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

序列化之三

    博客分类:
  • java
阅读更多
序列化介绍到后面,必然会开始解释其中的存储机制。这里面我想也没什么好讲的,无非是定义一种数据格式,然后按照这个格式存取罢了。
比如,字符串对象Harry会被存为  74 00 05 Harry (00 05是长度,74我想应该是L java/lang/String的简写吧,猜的。和后面的Harry Hacker对应的起来)
类标示符,则以72开头,比如下面的Employee类的完整类描述符:
72 00 08 Employee
   E6 D2 86 7D AE AC 18 18 02 (一个唯一标示符,SHA的前8字节)
   00 03 (对象个数)
   D 00 06 salary(double的 salary对象, 和JNI的类型描述一样一样的)
   L 00 07 hireDay (L出现了,具体类型在下面)
   74 00 07 Ljava/util/Date; (74也是规定,分号别忘了,呵呵)
   L 00 04 name
   74 00 12 Ljava/lang/String;
   78 (结束了)
   70 (无超类)
这事第一次表示的类,如果文件中会再次使用,可以使用一种缩写版:(后面代码跟上部分代码)
   40 E8 6A 00 00 00 00 00 (salary的值,double的)
   73                (73为规定,后面跟 类描述符  对象数据)
      71 00 7E 00 08 (71代表已经已经声明的类,后面跟的序列号,没错,序列化的序列号)
      77 08 00 00 00 91 1B 4E B1 80 78 (外部存储,这个后面讨论细节)
   74 00 0C Harry Hacker (name的String赋值)
这样,Employee就能被完整复原了。还有一些规定,如75为数组,70为空引用。(有一些是需要上下文解释的,代表的意义可能会不同,如71后面跟的是类描述符还是对象,70是空还是无超类等)
   其中,我们可以重写private void readObject(ObjectInputStream in)还有writeObject方法来做一些适配性的动作。而且,我们可以实现External接口,来对序列化进行全权负责,只需实现接口readExternal,writeExternel就可以了。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics