Java序列化的机制和原理

上传人:新** 文档编号:501360098 上传时间:2023-04-04 格式:DOCX 页数:4 大小:27.69KB
返回 下载 相关 举报
Java序列化的机制和原理_第1页
第1页 / 共4页
Java序列化的机制和原理_第2页
第2页 / 共4页
Java序列化的机制和原理_第3页
第3页 / 共4页
Java序列化的机制和原理_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《Java序列化的机制和原理》由会员分享,可在线阅读,更多相关《Java序列化的机制和原理(4页珍藏版)》请在金锄头文库上搜索。

1、Java 序列化的机制和原理有关Java对象的序列化和反序列化也算是Java基础的一部分,下面对Java序列化的机 制和原理进行一些介绍。Java 序列化算法透析Serialization序列化)是一种将对象以一连串的字节描述的过程;反序列化deserialization 是一种将这些字节重建成一个对象的过程。Java序列化API提供一种处理对象序列化的标 准机制。在这里你能学到如何序列化一个对象,什么时候需要序列化以及Java序列化的算 法,我们用一个实例来示范序列化以后的字节是如何描述一个对象的信息的。序列化的必要性Java中,一切都是对象,在分布式环境中经常需要将Object从这一端网络

2、或设备传递 到另一端。这就需要有一种可以在两端传输数据的协议。Java序列化机制就是为了解决这个 问题而产生。如何序列化一个对象一个对象能够序列化的前提是实现Serializable接口,Serializable接口没有方法,更像 是个标记。有了这个标记的Class就能被序列化机制处理。1. import java.io.Serializable;2.3. class TestSerial implements Serializable 4.5.public byte version =100;6.7.public byte count =0;8.9. 然后我们写个程序将对象序列化并输出。Ob

3、jectOutputStream能把Object输出成Byte 流。我们将Byte流暂时存储到temp.out文件里。1. public static void main(String args) throws IOException 2.3. FileOutputStream fos = new FileOutputStream(temp.out);4.5. ObjectOutputStream oos = new ObjectOutputStream(fos);6.7. TestSerial ts = new TestSerial();8.9. oos.writeObject(ts);10

4、.11.oos.flush();12.13.oos.close();14.15. 如果要从持久的文件中读取 Bytes 重建对象,我们可以使用 ObjectInputStream。1. public static void main(String args) throws IOException 2.3. FileInputStream fis = new FileInputStream(temp.out);4.5. ObjectInputStream oin = new ObjectInputStream(fis);6.7.TestSerial ts = (TestSerial) oin.r

5、eadObject();8.9.System.out.println(version=+ts.version);10.11. 执行结果为100.对象的序列化格式 将一个对象序列化后是什么样子呢?打开刚才我们将对象序列化输出的 temp.out 文件, 以 16 进制方式显示。内容应该如下:AC ED 00 05 73 72 00 0A 53 65 72 69 61 6C 54 65 73 74 A0 0C 34 00 FE B1 DD F9 02 00 02 42 00 05 63 6F 75 6E 74 42 00 07 76 65 72 73 69 6F 6E 78 70 00 64这一坨

6、字节就是用来描述序列化以后的TestSerial 对象的,我们注意到 TestSerial 类中只有两个域:public byte version = 100;public byte count = 0;且都是byte型,理论上存储这两个域只需要2个byte,但是实际上temp.out占据空间 为51bytes,也就是说除了数据以外,还包括了对序列化对象的其他描述。Java 的序列化算法 序列化算法一般会按步骤做如下事情: 将对象实例相关的类元数据输出。递归地输出类的超类描述直到不再有超类。类元数据完了以后,开始从最顶层的超类开始输出对象实例的实际数据值。从上至下递归输出实例的数据我们用另一个

7、更完整覆盖所有可能出现的情况的例子来说明1. class parent implements Serializable 2.3. int parentVersion =10;4.5. 6.7.8.9. class contain implements Serializable10.11. int containVersion =11;12.13. 14.15. public class SerialTest extends parent implements Serializab le 16.17.int version =66;18.19.contain con = new contain(

8、);20.21.22.23. public int getVersion() 24.25. return version;26.27.28.29.public static void main(String args) throws IOException 30.31. FileOutputStream fos = new FileOutputStream(t emp.out);32.33. ObjectOutputStream oos = new ObjectOutputStrea m(fos);34.35.SerialTest st = new SerialTest();36.37.oos

9、.writeObject(st);38.39.oos.flush();40.41.oos.close();42.43.44.45. 这个例子是相当的直白啦。SerialTest类实现了 Parent超类,内部还持有一个Container 对象。序列化后的格式如下:AC ED 00 05 73 72 00 0A 53 65 72 69 61 6C 54 6573 74 05 52 81 5A AC 66 02 F6 02 00 02 49 00 0776 65 72 73 69 6F 6E 4C 00 03 63 6F 6E 74 00 094C 63 6F 6E 74 61 69 6E 3B

10、78 I0D 70 61 72 65 6E 74 56 65 72 73 69 6F 6E 78 700HHIIIIIIIIIB 0E 63 6F 6E 74 61 69 6E 56 65 72 73 69 6F 6E 78我们来仔细看看这些字节都代表了啥。开头部分,见颜色:1.AC ED: STREAM_MAGIC.声明使用了序列化协议.2. 00 05: STREAM_VERSION. 序列化协议版本.3. 0x73: TC_OBJECT. 声明这是一个新的对象.序列化算法的第一步就是输出对象相关类的描述。例子所示对象为SerialTest类实例, 因此接下来输出SerialTest类的描述。见颜色:1. 0x72: TC_CLASSDESC.声明这里开始一个新 Class。2. 00 0A: Class

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号