java序列化与反序列化(1)------序列化、反序列化概念浅述

java序列化与反序列化是一项比较重要的技术点,目前也有很多成熟的组件可以使用比如protobuf、thrift、jute、jdk自带序列化等诸多可选项。

那么我们下面就介绍一下序列化相关的内容。


(1)什么是序列化与反序列化?

序列化:简洁的说序列化就是将jvm内存中对象的状态按照约定的某种方式转换成二进制字节流的过程。

反序列化:按照序列化时的约定方式从二进制字节流中重建对象的过程。


(2)什么情况下需要序列化和反序列化?

当我们想把jvm内存中的对象持久化到硬盘上的时候,为了便于重建对象,我们采用序列化这种机制。

当我们通过RPC框架进行远程 过程调用时,客户端将请求参数通过序列化的形式传递给服务端,服务端反序列化出对象获取参数。

当我们希望将我们的对象能以字符串形式存储到Redis等中间件中时,我们可以通过将对象序列化成文本存储。当需要的时候读取数据再进行反序列化。

当然还有很多其他可以使用序列化技术的场景,这里无法一一列举。


(3)如何选择序列化和反序列化组件?

面对这么多的序列化组件,我们该如何选择呢?当然实际的使用中我们可以通过如下四点来作为选择的依据。

  • 序列化之后的数据的字节大小
  • 序列化和反序列化的效率
  • 序列化对象状态改变之后,是否兼容旧版本客户端
  • 使用上是否需要借助第三方的IDL工具

不同的序列化组件由于使用了不同的序列化协议,导致序列化后的数据大小不同,理想情况下序列化之后的数据只有对象状态的数据。然而既要考虑能正常反序列化重建出对象,又要考虑向后兼容旧版本,这就不得不在序列化中增加额外的元数据,记录对象类名和域的完整信息。
像protobuf、thrift、Ice序列化组件,都是使用IDL来同时为客户端和服务端提供序列化对象的细节处理说明。因为客户端和服务端都是使用同一套IDL生成的代码,这样序列化之后的数据就会相对较小,对于对象的域只序列化域的类型和顺序id。而像Json、java自带序列化api这样的序列化机制,必须把序列化的详细数据分布信息序列化到二进制流中,这样势必会造成数据量的增加。
接下来我们会通过代码的形式来详细看看java自带序列化api和thrift序列化的内部机制。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章