Java序列化的机制和原理 - 编程入门网
{
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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |