欢迎来到天天文库
浏览记录
ID:51769448
大小:175.74 KB
页数:12页
时间:2020-03-15
《java序列化原理机制浅谈.docx》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、什么是序列化 java中的序列化(serialization)机制能够将一个实例对象的状态信息写入到一个字节流中,使其可以通过socket进行传输、或者持久化存储到数据库或文件系统中;然后在需要的时候,可以读取字节流中的信息来重构一个相同的对象。序列化机制在java中有着广泛的应用,EJB、RMI、hessian等技术都是以此为基础的。 so,序列化一般用于以下场景: 1:永久性保存对象,保存对象的字节序列到本地文件或者数据库中2:通过序列化以字节流的形式使对象在网络中进行传递和接收;3:通过序列化在进程间传递对象。 接下来我们将从序列化机
2、制原理等方面进行剖析 如何序列化一个对象类通过实现java.io.Serializable接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于标识可序列化的语义。 1:我们先来看看一个例子将对象序列化为一个字节流 我们将对象序列化并输出。ObjectOutputStream能把Object输出成Byte流。---上图显示的20行-26行我们将Byte流暂时存储到temp.out文件里。而在33行-39行,我们利用反序列化,根据字节流重建对象。 从上
3、面代码中,我们不难看出,序列化和反序列化的俩个主要类:ObjectOutputStream、ObjectInputStream。 序列化后的内容通过上面的例子我们知道,对象被序列化存在至文件temp.out中,我们可以通过工具UltraEdit以16进制方式打开该文件,看看它里面是以什么样的形式存在组织我们的对象的。 每一行分号后面的内容都是前面16进制码的注释。对于这些我们先随意YY下,这些内容的组织方式应该是:1:对象类型描述2:对象属性类型描述3:对象属性值 现在我们将以一个全面的例子来说明该问题:代码-1.1 [java
4、script] viewplaincopy1.class parent implements Serializable { 2. int parentVersion = 10; 3.} 4.class contain implements Serializable { 5. int containVersion = 11; 6.} 7.public class SerialTest extends parent implements Serializable { 8. int version = 66;
5、 9. contain con = new contain(); 1. public int getVersion() { 2. return version; 3. } 4. public static void main(String args[]) throws IOException { 5. FileOutputStream fos = new FileOutputStream("temp_1.out"); 6. ObjectOutputStream
6、 oos = new ObjectOutputStream(fos); 7. SerialTest st = new SerialTest(); 8. oos.writeObject(st); 9. oos.flush(); 10. oos.close(); 11. } 12.} temp_1.out文件内容如下: 先对上面图简单注释下:0000000h-000000c0h表示行号(我们一次可以称为第一行,第二行…………),0~f表示列;行后面的文字表示对这行16
7、进制的解释。 我们来仔细看看这些字节都是些说明东西。第一行的: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名称:如本例就是:testSe
8、rial.SerialTest;正好21的长度,16进制表示就为15了).3.7465737453657269 616C2E53657269616c5
此文档下载收益归作者所有