博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java序列化流程
阅读量:5741 次
发布时间:2019-06-18

本文共 1075 字,大约阅读时间需要 3 分钟。

hot3.png

序列化可以应用于远程服务间的通信,server端将响应对象进行序列化处理,然后形成二进制流,进行压缩后输出至客户端,本文主要讨论的是一个对象是如何被序列化的,根据在这个流程中所做的动作,我们可以逆推出如何对序列化后的对象,进行反序列化,识别出是哪个对象,该对象的成员变量,有哪些,这些成员变量是否也是参与了序列化等。

ObjectOutputStream:

用途:存放被序列化的对象的:类名(package+ClassName)、SerializableID、序列化类型标志位、成员变量的数目、变量名字、变量类型等

ObjectStreamClass

用途:

程序调用ObjectOutputStream.writeObject方法以后,会先生成该对象,官方的描述是:‘Serialization's descriptor for classes’,某个类的序列化描述信息,有哪些信息呢关于一个待序列化的类:类名、是否是代理、是否是枚举类型、序列化的方式(externalizable 或者serializable)、superDesc(超类的描述信息)、SerializableID、fields集合、构造函数cons等

ObjectStreamField

上面会说到ObjectStreamClass类会包含fields集合,其实就是ObjectStreamField的数组集合,这个类是做什么用的呢?用于存放成员变量的名称、类型等信息。

序列化简化流程:

1、序列化接口调用writeObject

2、生成ObjectStreamClass,如果有超类则先执行超类

3、序列化类基本信息以字节码存储至ObjectOutputStream的字节数组

4、成员变量的值序列化,重复执行步骤2和3、4,直至该成员变量没有下一级成员变量或者VALUE值为null,则完成序列化

综上所述,如果能够清楚的知道一个类的基本信息包括成员变量类型、数量、value值(也被参与序列化)构造、类名的信息,不同的是这些信息是以字节存储的,有了这些信息和知道存储规则,则反序列化是可以重新生成这个对象的,反序列化的时候也会调用构造但不是我们通常理解意义上的构造,所调用的构造实现类为sun.reflect.GeneratedSerializationConstructorAccessor1,该构造并不会调用我们的构造函数,关于反序列化相关的总结,下一篇会继续学习

 

转载于:https://my.oschina.net/13426421702/blog/705956

你可能感兴趣的文章
[LeetCode] Merge Intervals
查看>>
SharePoint 读取 Site Columns 的数据并绑定到DropdownList
查看>>
使用 axios 详解
查看>>
第 68 章 Logical Volume Manager (LVM)
查看>>
IPA提交APPStore问题记录(一)
查看>>
有利于seo优化的网站地图不能取巧
查看>>
快照产品体验优化
查看>>
ASCII
查看>>
ibatis SqlMap not found
查看>>
Android SD卡创建文件和文件夹失败
查看>>
Ubuntu 14.04 vsftp refusing to run with writable root inside chroot问题解决方法
查看>>
Intellij IDEA远程调试tomcat
查看>>
hadoop的学习论坛
查看>>
Struts2 学习小结
查看>>
烂泥:wordpress迁移到docker
查看>>
.扒渣机的性能及优势 
查看>>
Linux下磁盘保留空间的调整,解决df看到的空间和实际磁盘大小不一致的问题
查看>>
RSA 生成公钥、私钥对
查看>>
测试工具综合
查看>>
asp.net中调用COM组件发布IIS时常见错误 80070005解决方案
查看>>