序列化与反序列化的通俗解释及主要序列化的方法介绍

序列化与反序列化

  • 序列化:把对象转换为字节序列的过程。
  • 反序列化:把字节序列恢复为对象的过程。

举个例子,在JVM中,对象是以一定形式存在于内存中,然后被JVM识别从而可以以“对象”的方式是用它。那么序列化是什么呢,简单来说就是把内存中的对象的状态先以一种方式导出保存下来以便今后在某地方能够继续使用它。

序列化的组件

  • IDL(Interface description language)文件:参与通讯的各方需要对通讯的内容需要做相关的约定(Specifications)。为了建立一个与语言和平台无关的约定,这个约定需要采用与具体开发语言、平台无关的语言来进行描述。这种语言被称为接口描述语言(IDL),采用 IDL 撰写的协议约定称之为 IDL 文件。
  • IDL Compiler:IDL 文件中约定的内容为了在各语言和平台可见,需要有一个编译器,将 IDL 文件转换成各语言对应的动态库。
  • Stub/Skeleton Lib:负责序列化和反序列化的工作代码。Stub 是一段部署在分布式系统客户端的代码,一方面接收应用层的参数,并对其序列化后通过底层协议栈发送到服务端,另一方面接收服务端序列化后的结果数据,反序列化后交给客户端应用层;Skeleton 部署在服务端,其功能与 Stub 相反,从传输层接收序列化参数,反序列化后交给服务端应用层,并将应用层的执行结果序列化后最终传送给客户端 Stub。
  • Client/Server:指的是应用层程序代码,他们面对的是 IDL 所生成的特定语言的 class 或 struct。
  • 底层协议栈和互联网:序列化之后的数据通过底层的传输层、网络层、链路层以及物理层协议转换成数字信号在互联网中传递。

方法

  • XML(eXtensible Markup Language)& SOAP(Simple Object Access protocol)
  • JSON(Javascript Object Notation)
  • Avro(Apache)
  • Thrift(Facebook)
  • Protobuf(Google)

对于公司间的系统调用,如果性能要求在 100ms 以上的服务,基于 XML 的 SOAP 协议是一个值得考虑的方案。

基于 Web browser 的 Ajax,以及 Mobile app 与服务端之间的通讯,JSON 协议是首选。对于性能要求不太高,或者以动态类型语言为主,或者传输数据载荷很小的的运用场景,JSON 也是非常不错的选择。

对于调试环境比较恶劣的场景,采用 JSON 或 XML 能够极大的提高调试效率,降低系统开发成本。

当对性能和简洁性有极高要求的场景,Protobuf,Thrift,Avro 之间具有一定的竞争关系。

对于 T 级别的数据的持久化应用场景,Protobuf 和 Avro 是首要选择。如果持久化后的数据存储在 Hadoop 子项目里,Avro 会是更好的选择。

由于 Avro 的设计理念偏向于动态类型语言,对于动态语言为主的应用场景,Avro 是更好的选择。

对于持久层非 Hadoop 项目,以静态类型语言为主的应用场景,

Protobuf 会更符合静态类型语言工程师的开发习惯。

如果需要提供一个完整的 RPC 解决方案,Thrift 是一个好的选择。

如果序列化之后需要支持不同的传输层协议,或者需要跨防火墙访问的高性能场景,Protobuf 可以优先考虑。

发布了174 篇原创文章 · 获赞 15 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/LU_ZHAO/article/details/104962972