推广 热搜: csgo  vue  angelababy  2023  gps  新车  htc  落地  app  p2p 

#四、几种常见的序列化和反序列化协议

   2023-07-03 网络整理佚名1860
核心提示:XML是一种常用的序列化和反序列化协议,具有跨机器,跨语言等优点。是一种被广泛应用的,基于XML为序列化和反序列化协议的结构化消息传递协议。SOAP是一种采用XML进行序列化和反序列化的协议,它的IDL是WSDL.以上描述的五种序列化和反序列化协议都各自具有相应的特点,适用于不同的场景:

#概括

序列化和反序列化是工程师几乎每天都会面对的事情,但准确掌握这两个概念并不容易:一方面,它们经常作为框架的一部分出现,又消失在框架中; 另一方面,它们会以其他更容易理解的概念出现,比如加密、持久化。 然而,序列化和反序列化的选择是系统设计或重构的重要组成部分,尤其是在分布式和大数据量系统的设计中。 合适的序列化协议不仅可以提高系统的通用性、鲁棒性、安全性、优化系统性能,而且使系统更易于调试和扩展。 本文从多个角度对“序列化与反序列化”进行了分析和讲解,并对目前流行的几种序列化协议进行了比较,希望能够帮助读者进行序列化选择。

介绍

文章作者就职于美团推荐与个性化小组,每天致力于为美团用户提供优质的个性化推荐与排名服务。 从高层用户行为数据到高层Deal/Poi数据; 从要求毫秒级实时性能的用户实时地理位置数据,到常规的后台作业数据,推荐和重排序系统需要各种类型的数据服务。 推荐重排系统的客户包括各类内部服务、美团客户端、美团网站。 为了提供高质量的数据服务并实现与上下游系统的良好连接,序列化和反序列化的选择往往是我们系统设计中的重要考虑因素。

本文内容整理如下:

#1. 定义及相关概念

互联网的出现带来了机器之间通信的需求,互连通信的双方需要采用约定的协议,而序列化和反序列化是通信协议的一部分。 通信协议往往采用分层模型,不同模型每一层的功能定义和粒度都不同。 例如,TCP/IP协议是四层协议,而OSI模型是七层协议模型。 在OSI七层协议模型中,表示层(Layer)的主要功能是将应用层的对象转换为连续的二进制串,或者反过来,将二进制串转换为应用层的对象——这些两个函数是序列和反序列化。 一般来说,TCP/IP协议的应用层对应于OSI七层协议模型的应用层、表示层、会话层,因此串行化协议是TCP/IP协议应用层的一部分。 本文对序列化协议的讲解主要基于OSI七层协议模型。

数据结构、对象和二进制字符串

在不同的计算机语言中,数据结构、对象和二进制字符串以不同的方式表示。

数据结构和对象:对于像Java这样完全面向对象的语言,工程师操作的一切都是对象(),它来自于类的实例化。 Java语言中最接近数据结构的概念是POJO(Plain Old Java)或者-那些只有/方法的类。 在C++等半面向对象语言中,数据结构对应于对象,对象对应于类。

二进制字符串:序列化生成的二进制字符串是指存储在内存中的一段数据。 C++语言有内存运算符,因此二进制字符串的概念很容易理解。 例如,C++语言中的字符串可以直接被传输层使用,因为它本质上是存储在内存中以'\0'结尾的二进制字符串。 在Java语言中,二进制字符串的概念既简单又容易混淆。 事实上,它是Java的一等公民,是一个特殊的对象()。 对于跨语言通信,当然序列化的数据不能是某种语言的特殊数据类型。 二进制字符串指的是Java中的byte[],byte是Java的8种原生数据类型(数据类型)之一。

#2. 序列化协议特性

每个序列化协议都有优点和缺点,并且在设计之初都有自己独特的应用场景。 在系统设计过程中,需要考虑序列化需求的方方面面,综合比较各种序列化协议的特点,最终给出一个折中的解决方案。

多功能性

多功能性有两个层面的含义:

首先,在技术层面,序列化协议是否支持跨平台、跨语言。 如果不支持,技术层面的通用性就会大大降低。

第二,人气。 序列化和反序列化需要多方参与。 很少有人使用的协议往往意味着昂贵的学习成本。 另一方面,流行度不高的协议往往缺乏稳定、成熟的跨语言、跨语言的平台公共包。

鲁棒性/鲁棒性

该协议不够稳健有两个原因:

首先,成熟度不够。 协议从制定到实施再到最终成熟往往是一个漫长的阶段。 协议的稳健性取决于大量的综合测试。 对于一个致力于提供高质量服务的系统来说,在测试阶段采用序列化协议会带来很高的风险。

其次,语言/平台的不公平。 为了支持跨语言、跨平台的功能,序列化协议开发者需要做大量的工作; 然而,当所支持的语言或平台之间存在难以协调的特性时,协议开发者需要做出一个艰难的决定——支持更多人使用的语言/平台,或者支持更多的语言/平台但放弃某些特征。 当协议制定者决定为某种语言或平台提供更多支持时,就会为了用户而牺牲协议的稳健性。

可调试性/可读性

序列化和反序列化数据正确性和业务正确性的调试往往需要较长的时间,良好的调试机制将大大提高开发效率。 序列化的二进制字符串通常无法被人眼读取。 为了验证序列化结果的正确性,编写者一定不能同时编写反序列化程序,或者提供查询平台——这样很耗时; 另一方面,如果反序列化失败,这会给问题查找带来很大的挑战——很难定位到底是自己反序列化程序的bug导致的,还是序列化后的错误导致的通过数据。 对于跨公司调试,由于以下原因,问题更加严重:

一是支撑不到位。 跨公司调试出现问题后可能无法得到及时支持,从而大大延长了调试周期。

二是准入限制。 调试阶段的查询平台可能不对外开放,增加了读者验证的难度。

如果序列化后的数据是人类可读的,那么将大大提高调试效率,而XML和JSON就具有人类可读的优势。

表现

性能包括两个方面,时间复杂度和空间复杂度:

首先,空间开销(),序列化需要在原始数据上添加描述字段,以便反序列化和分析。 如果序列化过程引入的额外开销过高,可能会对网络、磁盘等方面造成过大的压力。 对于海量分布式存储系统来说,数据量往往以TB级为单位,巨大的额外空间开销意味着高昂的成本。

其次,时间开销(),复杂的序列化协议会导致解析时间过长,这可能使得序列化和反序列化阶段成为整个系统的瓶颈。

可扩展性/兼容性

移动互联网时代,业务系统需求的更新周期变得更快,新的需求不断涌现,而旧的系统仍然需要维护。 如果序列化协议具有良好的扩展性,支持自动添加新的业务字段而不影响旧的业务,这将大大增加系统的灵活性。

安全/访问限制

在序列化选择过程中,安全考虑往往出现在跨局域网访问的场景中。 当公司之间或跨机房进行通信时,出于安全考虑,跨局域网的访问往往基于HTTP/HTTPS被限制在80和443端口。 如果所使用的序列化协议不受兼容且成熟的 HTTP 传输层框架的支持,可能会导致以下三种结果之一:

首先,由于访问限制,服务可用性降低。

其次,被迫重新实施安全协议会导致实施成本显着升高。

第三,以牺牲安全为代价开放更多的防火墙端口和协议访问。

#3。 序列化和反序列化组件

典型的序列化和反序列化过程通常需要以下组件:

序列化组件和数据库访问组件的比较

数据库访问对于很多工程师来说都比较熟悉,使用的组件也比较容易理解。 下表比较了序列化过程中用到的一些组件与数据库访问组件的对应关系,以便大家更好的掌握序列化相关组件的概念。

序列化组件 数据库组件 描述 IDL 用于构建表或模型的 DDL 语言 DL 文件 DB 表创建文件或模型文件 Stub/lib O/R 映射类和表或数据模型

#4。 几种常见的序列化和反序列化协议

早期的序列化协议主要有COM和CORBA。

COM主要用于平台,并没有真正实现跨平台。 另外,COM的序列化原理使用了编译器中的虚表,这使得它的学习成本巨大(想想这个场景,工程师需要一个简单的序列化协议,但需要先掌握语言编译器)。 由于序列化数据与编译器的紧密耦合,扩展属性很麻烦。

CORBA 是跨平台、跨语言序列化协议的早期实现。 COBRA的主要问题是参与方过多带来的版本过多、版本间兼容性差、使用复杂晦涩。 这些政治经济、技术实现和早期设计不成熟的问题最终导致了 COBRA 的逐渐消亡。 J2SE 1.3以后的版本提供了基于CORBA协议的RMI-IIOP技术,使得Java开发人员可以使用纯Java语言进行CORBA开发。

这里我们主要介绍和比较几种流行的序列化协议,包括XML、JSON、Avro。

一个例子

正如前面提到的,序列化和反序列化的出现往往是晦涩和隐藏的,而且它们往往与其他概念相互包容。 为了更好的让大家理解各个协议中序列化和反序列化相关概念的具体实现,我们在各种序列化协议的讲解中会穿插一个例子。 在这个例子中,我们希望在多个系统之间传输一个用户的信息; 在应用层,如果使用Java语言,面临的类对象如下:

XML&SOAP

XML是一种常用的序列化和反序列化协议,具有跨机器、跨语言的优点。 XML有着悠久的历史,其1.0版本早在1998年就已经形成标准,并一直广泛使用至今。 XML最初的目标是标记互联网文档(),因此其设计理念包括人类和机器的可读性。 然而,当标记文档的这种设计用于序列化对象时,它会变得冗长和复杂(并且)。 XML本质上是一种描述语言,具有自描述(Self-)的属性,因此XML本身用于XML序列化的IDL。 有两种标准的XML描述格式:DTD(Type)和XSD(XML)。 XML作为一种人类可读(Human-)的描述语言,广泛应用于配置文件,如O/R、Bean File等。

SOAP(SOAP)是一种广泛使用的基于XML作为序列化和反序列化协议的结构化消息传递协议。 SOAP 对 产生了如此大的影响,以至于我们给基于 SOAP 的解决方案起了一个特定的名称——Web。 虽然SOAP可以支持多种传输层协议,但最常见的使用SOAP的方式是XML+HTTP。 SOAP协议的主要接口描述语言(IDL)是WSDL(Web)。 SOAP安全、可扩展、跨语言、跨平台并支持多种传输层协议。 如果不考虑跨平台、跨语言的需求,XML在某些语言中有非常简单易用的序列化方式,不需要IDL文件和第三方编译器,比如Java+。

自描述和递归

SOAP 是一种使用 XML 进行序列化和反序列化的协议。 它的 IDL 是 WSDL。 WSDL的描述文件是XSD,XSD本身是一个XML文件。 这里出现了一个有趣的问题,数学上叫“递归”,这种现象经常发生在具有自属性(Self-)的事物上。

IDL 文件示例

使用WSDL描述上述用户基本信息的示例如下:

典型应用场景和非应用场景

SOAP协议拥有广泛的群众基础,基于HTTP的传输协议使其在穿越防火墙时具有良好的安全特性,XML的人类可读(Human-)特性使其具有出色的可调试性。 大幅提升也极大地弥补了其空间开销大的缺点()。 对于公司之间传输数据量比较少或者实时性要求比较低(比如秒级)的服务来说是一个不错的选择。

由于XML的额外空间开销较大,导致序列化后的数据量急剧增加。 对于具有大量数据的持久性应用程序来说很常见,这意味着巨大的内存和磁盘开销,并且不适合 XML。 另外,XML序列化和反序列化的空间和时间开销都比较大,对于ms级性能要求的服务不建议使用。 虽然WSDL有描述对象的能力,SOAP的S也有,但是SOAP的使用绝对不简单。 对于习惯于面向对象编程的用户来说,WSDL 文件并不直观。

JSON()

JSON起源于弱类型语言,它的产生来源于一个叫做“数组”的概念,其本质是以“-值”的形式描述对象。 事实上,在PHP等弱类型语言中,类的描述方式是数组。 JSON 的以下优点使其迅速成为使用最广泛的序列化协议之一:

1.这种数组格式非常符合工程师对对象的理解。

2.它保持了XML的人类可读(Human-)的优点。

3、与XML相比,序列化数据更加简洁。 下面链接的研究表明,XML 生成的序列化文件大小几乎是 JSON 的两倍。

4、具有先天的支持,因此在Web的应用场景中得到广泛的应用,是Ajax事实上的标准协议。

5、与XML相比,其协议更简单,解析速度更快。

6、松散的阵列使其具有良好的扩展性和兼容性。

IDL悖论

JSON太简单了,或者说与各种语言中的类太相似,所以使用JSON进行序列化不需要IDL。 这真是太神奇了。 有一种天然的序列化协议,它本身就实现了跨语言、跨平台。 然而,事实并没有那么神奇。 造成这种错觉的原因有两个:

首先,数组是弱类型语言中类的概念,数组是其类在PHP和PHP中的实际实现,所以JSON在这些弱类型语言中得到了很好的支持。

其次,IDL的目的是编写IDL文件,而IDL文件经过IDL编译后可以生成一些代码(Stub/),而这些代码就是真正负责相应的序列化和反序列化工作的组件。 但由于数组与一般语言中的类太相似,它们之间是一一对应的,这使得我们可以使用一套标准代码进行相应的转换。 对于本身支持数组的弱类型语言来说,语言本身就具备操作JSON序列化数据的能力; 对于Java这样的强类型语言,可以通过反射来统一解决,比如提供的Gson。

典型应用场景和非应用场景

JSON在很多应用场景中可以替代XML,更加简洁,解析速度也更快。 典型应用场景包括:

1、企业之间传输的数据量比较小,实时性要求比较低(比如秒级)的服务。

2.基于Web的Ajax请求。

3、由于JSON具有非常强的前向和后向兼容性,所以接口变化频繁,可调整性要求很高,比如app和服务器之间的通信。

4、由于JSON的典型应用场景是JSON+HTTP,因此适合跨防火墙访问。

一般来说,使用JSON进行序列化的额外空间开销是比较大的。 对于大数据量的服务或者持久化来说,这意味着巨大的内存和磁盘开销,不太适合这种场景。 缺乏统一且可用的 IDL 减少了对参与者的限制。 在实际应用中,只能使用文档来达成协议,这可能会给调试带来一些不便,并会延长开发周期。 由于部分语言中JSON的序列化和反序列化需要反射机制,因此在性能需求为ms级别时不建议使用。

IDL 文件示例

这是序列化后的示例:

它是开源提供的高性能、轻量级的RPC服务框架。 它是为了满足当前大数据量、分布式、跨语言、跨平台数据通信的需求而产生的。 然而,它不仅仅是一个序列化协议,而是一个 RPC 框架。 与JSON和XML相比,它在空间开销和解析性能上都有比较大的提升。 对于性能要求较高的分布式系统来说,是一个优秀的RPC解决方案; 但由于序列化是嵌入在框架中的,框架本身并没有暴露序列化和反序列化接口,这使得它很难与其他传输层协议(例如HTTP)一起使用。

典型应用场景与非应用场景

它是高性能、分布式RPC服务的优秀解决方案。 它支持多种语言和丰富的数据类型,对数据字段的添加和删除具有很强的兼容性。 因此,它非常适合作为公司内部面向服务架构(SOA)的标准RPC框架。

但文献资料比较缺乏,目前使用的群众基础也比较小。 另外,由于是基于自己的服务,跨防火墙访问时安全性是一个问题,所以公司之间通信时需要谨慎。 另外,序列化后的数据是数组,不可读,调试代码也比较困难。 最后,由于序列化与框架的紧耦合,无法支持直接读写数据到持久层,因此不适合数据持久化序列化协议。

IDL 文件示例

它具有优秀的序列化协议所需的许多典型特征:

1.标准的IDL和IDL编译器,这对于工程师来说非常友好。

2.序列化后的数据非常简洁紧凑。 与XML相比,序列化数据量约为XML的1/3到1/10。

3、解析速度非常快,比对应的XML快20-100倍左右。

4、提供了非常友好的动态库,使用起来非常简单,反序列化只需要一行代码。

它是纯表示层协议,可以与各种传输层协议一起使用; 它的文档也非常完整。 但由于其出身原因,目前仅支持Java、C++三种语言。 另外,支持的数据类型比较少,不支持常量类型。 由于其设计理念是纯粹的表示层协议(Layer),目前还没有专门支持的RPC框架。

典型应用场景和非应用场景

用户基数广,空间开销小,分辨率性能高是其亮点,非常适合公司内部对性能要求较高的RPC调用。 由于提供了标准的IDL和相应的编译器,因此IDL文件对于相关各方来说是一个非常强的业务约束。 另外,它与传输层无关,而且HTTP具有良好的跨防火墙访问特性,因此也适合公司间对性能要求较高的场景。 由于其解析性能较高,且序列化后数据量相对较小,非常适合应用层对象的持久化场景。

它的主要问题是支持的语言相对较少。 另外,由于没有标准的底层传输层协议绑定,公司之间调试传输层协议也相对麻烦。

IDL 文件示例

阿夫罗

Avro 的产生解决了 JSON 冗长和 Avro 所属子项目 IDL 缺失的问题。 Avro 提供两种序列化格式:JSON 格式或 JSON 格式。 该格式在空间开销和解析性能方面相当,并且JSON格式方便测试阶段的调试。 Avro支持的数据类型非常丰富,包括C++语言中的union类型。 Avro支持JSON格式的IDL和类似于and的IDL(实验阶段),两者之间可以相互转换。 随其发送数据的能力与 JSON 的自描述性质相结合,使 Avro 非常适合动态类型语言。 Avro用于文件持久化时,一般与Avro存储在一起,因此Avro序列化文件本身具有自描述属性,因此非常适合Hive、Pig和. 对于不同版本,在进行RPC调用时,服务器和客户端可以在握手阶段互相确认,这大大提高了最终的数据解析速度。

典型应用场景和非应用场景

Avro解析性能高,序列化数据非常简洁,更适合高性能序列化服务。

由于 Avro 的非 JSON 格式的 IDL 目前处于实验阶段,因此 JSON 格式的 IDL 对于习惯于静态类型语言的工程师来说并不直观。

IDL 文件示例

对应的JSON格式如下:

#5、选型建议

##

以下数据来自

分析性能

序列化空间开销

从上图可以得出以下结论:

1. XML序列化()在性能和简单性方面都比较差。

2、与物联网相比,在时间和空间开销方面存在一定的劣势。

3、Avro在这两方面都非常优越。

选型建议

上述五种序列化和反序列化协议都有相应的特点,适用于不同的场景:

1、对于公司间的系统调用,如果服务性能要求超过100ms,基于XML的SOAP协议是值得考虑的解决方案。

2. JSON协议是基于Web的Ajax以及应用程序和服务器之间通信的首选。 对于性能要求不是太高,或者主要使用动态类型语言,或者传输数据负载较小的应用场景,JSON也是一个非常好的选择。

3、对于调试环境比较恶劣的场景,使用JSON或XML可以大大提高调试效率,降低系统开发成本。

4、在对性能和简单性要求极高的场景下,Avro之间存在一定的竞争关系。

5.对于T级数据的持久化应用场景,Avro和Avro是首选。 如果持久化数据存储在子项目中,Avro 将是更好的选择。

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

7、对于非持久层项目,基于静态类型语言的应用场景会更符合静态类型语言工程师的开发习惯。

8.如果需要提供完整的RPC解决方案,是一个不错的选择。

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

参考:

 
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报
Powered By DESTOON