java 序列化原理机制浅谈.docx
上传人:qw****27 上传时间:2024-09-12 格式:DOCX 页数:12 大小:207KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

java 序列化原理机制浅谈.docx

java序列化原理机制浅谈.docx

预览

免费试读已结束,剩余 2 页请下载文档后查看

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

什么是序列化java中的序列化(serialization)机制能够将一个实例对象的状态信息写入到一个字节流中,使其可以通过socket进行传输、或者持久化存储到数据库或文件系统中;然后在需要的时候,可以读取字节流中的信息来重构一个相同的对象。序列化机制在java中有着广泛的应用,EJB、RMI、hessian等技术都是以此为基础的。so,序列化一般用于以下场景:1:永久性保存对象,保存对象的字节序列到本地文件或者数据库中2:通过序列化以字节流的形式使对象在网络中进行传递和接收;3:通过序列化在进程间传递对象。接下来我们将从序列化机制原理等方面进行剖析如何序列化一个对象类通过实现java.io.Serializable接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于标识可序列化的语义。1:我们先来看看一个例子将对象序列化为一个字节流我们将对象序列化并输出。ObjectOutputStream能把Object输出成Byte流。---上图显示的20行-26行我们将Byte流暂时存储到temp.out文件里。而在33行-39行,我们利用反序列化,根据字节流重建对象。从上面代码中,我们不难看出,序列化和反序列化的俩个主要类:ObjectOutputStream、ObjectInputStream。序列化后的内容通过上面的例子我们知道,对象被序列化存在至文件temp.out中,我们可以通过工具UltraEdit以16进制方式打开该文件,看看它里面是以什么样的形式存在组织我们的对象的。每一行分号后面的内容都是前面16进制码的注释。对于这些我们先随意YY下,这些内容的组织方式应该是:1:对象类型描述2:对象属性类型描述3:对象属性值现在我们将以一个全面的例子来说明该问题:代码-1.1[javascript]HYPERLINK"http://blog.csdn.net/morethinkmoretry/article/details/5929345"\o"viewplain"viewplainHYPERLINK"http://blog.csdn.net/morethinkmoretry/article/details/5929345"\o"copy"copyclassparentimplementsSerializable{intparentVersion=10;}classcontainimplementsSerializable{intcontainVersion=11;}publicclassSerialTestextendsparentimplementsSerializable{intversion=66;containcon=newcontain();publicintgetVersion(){returnversion;}publicstaticvoidmain(Stringargs[])throwsIOException{FileOutputStreamfos=newFileOutputStream("temp_1.out");ObjectOutputStreamoos=newObjectOutputStream(fos);SerialTestst=newSerialTest();oos.writeObject(st);oos.flush();oos.close();}}temp_1.out文件内容如下:先对上面图简单注释下:0000000h-000000c0h表示行号(我们一次可以称为第一行,第二行…………),0~f表示列;行后面的文字表示对这行16进制的解释。我们来仔细看看这些字节都是些说明东西。第一行的:0列-4列1.ACED:STREAM_MAGIC.声明使用了序列化协议.可以理解为实现了Serializable类2.0005:STREAM_VERSION.序列化协议版本.3.0x73:TC_OBJECT.声明这是一个新的对象.因此第一步存储的就是序列化的描述。二:输出SerialTest类的描述:第一行的5列到三行的7列1:4.0x72:TC_CLASSDESC.声明这里开始一个新Class。2.0015:Class名字的长度(包括package名称:如本例就是:testSerial.SerialTest;正好21的长度,16进制表示就为15了).3.7465737453657269616C2E53657269616c5465