互联网早期的序列化协议主要有COM和CORBA。
COM主要用于Windows平台,并没有真正实现跨平台,另外COM的序列化的原理利用了编译器中虚表,使得其学习成本巨大(想一下这个场景, 工程师需要是简单的序列化协议,但却要先掌握语言编译器)。由于序列化的数据与编译器紧耦合,扩展属性非常麻烦。
CORBA 是早期比较好的实现了跨平台,跨语言的序列化协议。COBRA的主要问题是参与方过多带来的版本过多,版本之间兼容性较差,以及使用复杂晦涩。这些政治经 济,技术实现以及早期设计不成熟的问题,最终导致COBRA的渐渐消亡。J2SE 1.3之后的版本提供了基于CORBA协议的RMI-IIOP技术,这使得Java开发者可以采用纯粹的Java语言进行CORBA的开发。
这里主要介绍和对比几种当下比较流行的序列化协议,包括XML、JSON、Protobuf、Thrift和Avro。
XML&SOAP
XML 是一种常用的序列化和反序列化协议,具有跨机器,跨语言等优点。 XML历史悠久,其1.0版本早在1998年就形成标准,并被广泛使用至今。XML的最初产生目标是对互联网文档(Document)进行标记,所以它的 设计理念中就包含了对于人和机器都具备可读性。 但是,当这种标记文档的设计被用来序列化对象的时候,就显得冗长而复杂(Verbose and Complex)。 XML本质上是一种描述语言,并且具有自我描述(Self-describing)的属性,所以XML自身就被用于XML序列化的IDL。 标准的XML描述格式有两种:DTD(Document Type Definition)和XSD(XML Schema Definition)。作为一种人眼可读(Human-readable)的描述语言,XML被广泛使用在配置文件中,例如O/R mapping、 Spring Bean Configuration File 等。
SOAP(Simple Object Access protocol) 是一种被广泛应用的,基于XML为序列化和反序列化协议的结构化消息传递协议。SOAP在互联网影响如此大,以至于我们给基于SOAP的解决方案一个特定 的名称--Web service。SOAP虽然可以支持多种传输层协议,不过SOAP最常见的使用方式还是XML+HTTP。SOAP协议的主要接口描述语言(IDL)是 WSDL(Web Service Description Language)。SOAP具有安全、可扩展、跨语言、跨平台并支持多种传输层协议。如果不考虑跨平台和跨语言的需求,XML的在某些语言里面具有非常 简单易用的序列化使用方法,无需IDL文件和第三方编译器, 例如Java+XStream。
SOAP 是一种采用XML进行序列化和反序列化的协议,它的IDL是WSDL. 而WSDL的描述文件是XSD,而XSD自身是一种XML文件。 这里产生了一种有趣的在数学上称之为“递归”的问题,这种现象往往发生在一些具有自我属性(Self-description)的事物上。
JSON(Javascript Object Notation)
JSON 起源于弱类型语言Javascript, 它的产生来自于一种称之为"Associative array"的概念,其本质是就是采用"Attribute-value"的方式来描述对象。实际上在Javascript和PHP等弱类型语言中,类的 描述方式就是Associative array。JSON的如下优点,使得它快速成为最广泛使用的序列化协议之一。
这种Associative array格式非常符合工程师对对象的理解。
它保持了XML的人眼可读(Human-readable)的优点。
相对于XML而言,序列化后的数据更加简洁。 来自于的以下链接的研究表明:XML所产生序列化之后文件的大小接近JSON的两倍。
它具备Javascript的先天性支持,所以被广泛应用于Web browser的应用常景中,是Ajax的事实标准协议。
与XML相比,其协议比较简单,解析速度比较快。
松散的Associative array使得其具有良好的可扩展性和兼容性。
Thrift
Thrift 是Facebook开源提供的一个高性能,轻量级RPC服务框架,其产生正是为了满足当前大数据量、分布式、跨语言、跨平台数据通讯的需求。 但是,Thrift并不仅仅是序列化协议,而是一个RPC框架。相对于JSON和XML而言,Thrift在空间开销和解析性能上有了比较大的提升,对于 对性能要求比较高的分布式系统,它是一个优秀的RPC解决方案;但是由于Thrift的序列化被嵌入到Thrift框架里面,Thrift框架本身并没有 透出序列化和反序列化接口,这导致其很难和其他传输层协议共同使用(例如HTTP)。
Protobuf
Protobuf具备了优秀的序列化协议的所需的众多典型特征。
标准的IDL和IDL编译器,这使得其对工程师非常友好。
序列化数据非常简洁,紧凑,与XML相比,其序列化之后的数据量约为1/3到1/10。
解析速度非常快,比对应的XML快约20-100倍。
提供了非常友好的动态库,使用非常简介,反序列化只需要一行代码。
Protobuf 是一个纯粹的展示层协议,可以和各种传输层协议一起使用;Protobuf的文档也非常完善。 但是由于Protobuf产生于Google,所以目前其仅仅支持Java、C#### 典型应用场景和非应用场景 Protobuf具有广泛的用户基础,空间开销小以及高解析性能是其亮点,非常适合于公司内部的对性能要求高的RPC调用。由于Protobuf提供了标 准的IDL以及对应的编译器,其IDL文件是参与各方的非常强的业务约束,另外,Protobuf与传输层无关,采用HTTP具有良好的跨防火墙的访问属 性,所以Protobuf也适用于公司间对性能要求比较高的场景。由于其解析性能高,序列化后数据量相对少,非常适合应用层对象的持久化场景。
它的主要问题在于其所支持的语言相对较少,另外由于没有绑定的标准底层传输层协议,在公司间进行传输层协议的调试工作相对麻烦。
Avro
Avro 的产生解决了JSON的冗长和没有IDL的问题,Avro属于Apache Hadoop的一个子项目。 Avro提供两种序列化格式:JSON格式或者Binary格式。Binary格式在空间开销和解析性能方面可以和Protobuf媲美,JSON格式方 便测试阶段的调试。 Avro支持的数据类型非常丰富,包括C#### 典型应用场景和非应用场景 Avro解析性能高并且序列化之后的数据非常简洁,比较适合于高性能的序列化服务。
由于Avro目前非JSON格式的IDL处于实验阶段,而JSON格式的IDL对于习惯于静态类型语言的工程师来说不直观。
选型建议
以上描述的五种序列化和反序列化协议都各自具有相应的特点,适用于不同的场景。
对于公司间的系统调用,如果性能要求在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可以优先考虑。
相关推荐
本篇将介绍几个常用的Java序列化和反序列化框架,并通过示例代码进行演示。 1. **Java标准序列化**: Java标准序列化通过实现`Serializable`接口来标记类可序列化。要序列化一个对象,可以使用`ObjectOutputStream...
在IT行业中,Web服务是应用程序之间进行通信的一种标准方法,而动态调用Web服务和复杂对象的序列化、反序列化是开发过程中常见的技术环节。本文将深入探讨这两个主题。 首先,让我们理解什么是动态调用Web服务。Web...
以下是几种常见的Java序列化方式的详细解释: 1. **Java原生序列化** Java原生序列化是最基础的序列化方式,适用于Java标准库中的对象。要进行序列化,对象所属的类必须实现`Serializable`接口。这个过程通常涉及...
2. **XML**:XML是一种常见的序列化协议,具有良好的可读性和自定义元素特性。然而,XML序列化数据仅包含数据本身,不包括类型信息,且需要有默认构造函数的类才能被序列化。此外,XML文件庞大,解析速度相对较慢,...
本资源"IOS应用源码之自动序列化AutoEncodeDecode.zip"提供了一种自动序列化的实现,它可以帮助开发者更便捷地处理对象到数据的转换和反转换,减轻手动编码的工作量。 在iOS中,我们常用的序列化技术有...
protobuf是Google开发的一种高效的数据序列化协议,它在传输效率和存储空间上优于JSON和XML。 4. **推荐系统**:信息推荐方法通常基于用户的历史行为、兴趣偏好和上下文环境,为用户提供个性化的内容。在电信设备中...
在分布式系统中,RPC(Remote Procedure Call)协议是一种常见的通信方式,它允许程序在不同的进程中调用对方的方法,就像调用本地方法一样简单。Kryonet是Java领域中一个轻量级、高效的RPC框架,它利用了Kryo库进行...
C++中实现序列化的一种常见方式是使用`std::ofstream`和`std::ifstream`进行文件操作,配合`和`>>`操作符重载,将对象的状态写入和读出。另一种方式是使用序列化库,如Google的Protocol Buffers、Apache Thrift或...
4. **Protocol Buffers (protobuf)**:由Google开发的一种高效的二进制序列化协议,支持多种语言,其数据格式具有版本兼容性,能够处理大规模数据。 5. **Apache Thrift**:另一种跨语言的序列化框架,它不仅提供...
Dubbo是阿里巴巴开源的一款高性能、轻量级的RPC框架,它支持多种序列化方式,包括Hessian、Fastjson等,通常推荐使用Hessian作为默认序列化协议。Dubbo使用TCP作为传输协议,并采用NIO(非阻塞I/O)框架Netty提高...
Java的序列化机制会自动处理参数和返回值的序列化和反序列化。 HttpInvoker的优势在于其对复杂对象的支持,特别是当参数或返回值无法通过Hessian等轻量级序列化机制处理时。然而,由于依赖Java序列化,这可能会导致...
根据提供的文档信息,我们可以深入探讨Java序列化与反序列化机制以及由此引发的安全漏洞问题。...通过对Java序列化和反序列化机制的深入了解以及对相关安全措施的应用,可以有效降低由反序列化漏洞带来的安全风险。
本文将深入探讨C#中的`Serializable`序列化,并介绍几种常见的序列化技术及其应用。 1. **二进制序列化** 二进制序列化能保持类型信息,确保在序列化和反序列化过程中对象的原始状态得到保留。它可以将对象序列化...
Java 中几种常用的 RPC 框架 Java 中的 RPC 框架有多种,各有特色,广泛使用的有 RMI、Hessian、Dubbo 等。下面将对这些框架进行详细的介绍和对比。 一、RMI(Remote Method Invocation) RMI 是 Java 自带的远程...
TCP(传输控制协议)和UDP(用户数据报协议)是两种常见的套接字类型,TCP提供可靠的数据传输,而UDP则更注重速度。在Python中,`socket`模块提供了创建和管理套接字的功能。 最后,序列化是将对象转换为可存储或...
3. **优化的序列化和反序列化**:AMF3对常见的数据类型如整数、浮点数、字符串等进行了优化,提高解析速度。 4. **动态对象支持**:AMF3能序列化和反序列化动态对象,允许在服务器和客户端之间传递复杂的数据结构。 ...
本文将详细介绍C#的三种序列化方法:二进制(流)序列化、SOAP序列化和XML序列化。 首先,让我们理解序列化的基础。序列化是将一个对象转换为字节流的过程,这个字节流可以存储在磁盘上,或者在网络中传输。反序列...
用于读取和写入基于 Google 协议缓冲区的几种常见数据格式的纯 C++ 实现。 目前支持序列化 R 对象的“rexp.proto”、二进制 geojson 的“geobuf.proto”和矢量切片的“mvt.proto”。 该包使用 protobuf-compiler ...
例如,开源项目protobuf-net提供了Protocol Buffers的.NET实现,这是一种高效的序列化协议,比XML和JSON更小、更快。另一个选择是Json.NET,它支持JSON格式,特别适合RESTful Web Services。 在"In-Search-of-the-...
protobuf-net是Google开源的一种数据序列化协议,全称为Protocol Buffers。它允许开发者定义数据结构,然后将数据对象转换为二进制格式进行存储或网络传输,以提高效率和节省空间。在Unity游戏开发中,protobuf-net...