`

二进制编码格式:Protocol Buffers

 
阅读更多

Google开源了一种数据交换格式——Protocol Buffers。在它语焉不详的名字背后,藏着的是:

  • 一种描述数据格式的IDL
  • 对IDL所描述的格式进行编码的一种二进制编码方案
  • 通过代码生成器实现的数据绑定支持,Google提供了C++、Python、Java实现

它的IDL用来描述数据格式,下面是来自Protocol Buffers项目网站的例子
message Person { 
required int32 id = 1;
required string name = 2;
 optional string email = 3;
}
要明确指定字段名称对应的序号(称为“tag”),才能在以后变更格式。如果用自动分配的序号,对格式的更改会引起麻烦(比如在中间插入一个新字段)。为 什么呢?因为在二进制格式,tag是用来说明某段字节编码所表示的(协议描述里的)字段的。明确地分配tag序号,搭配上忽略未知tag的规则,在变更格 式的时候就可以从容增加字段而不影响已有字段。 

格式描述保存在.proto文件里,编译成源代码之后使用。Protocol Buffers发布的时候已经包括了对C++、Python和Java的支持。对其他语言的支持也正在进行之中,例如Ruby、Erlang、Perl、Haskell等等。有意增加其他语言支持的人都应该会很高兴有人已经将.proto文件的语法反向工程成了EBNF

语言支持就是把.proto文件转换成目标语言的代码,组成映射到.proto文件所定义格式的一些类。有了语言支持就能从二进制数据中重组出对象,修改里面的字段,然后把对象的状态重新序列化成二进制格式。 

一 如以往Google发布新项目的情况, Protocol Buffers也激起了不小的骚动,占据了不少博客帖子。 Google的官方博客也解释了开发Protocol Buffers的原因,里头曾提到XML用作编码格式效率非常低。这种说法引来了潮水般的博客贴——有些认为Protocol Buffers意味着XML的结束,有些认为Protocol Buffers不如XML。Ted Neward对现状做了如下总结
总 而言之,如果你想要松散耦合的终端程序,保留最大的灵活性,那就接着用XML,包装进SOAP封包或者符合底层传输(也就是说HTTP,因为依赖其他传输 形式的REST还没有真正被定义)要求的RESTful封包。 如果你需要二进制格式,Protocol Buffers是其中一个答案……但ICE也是,甚至CORBA(虽然参与者日少已经使它失去了吸引力)。不要仅仅由于贴上了Google的商标,就忽略 了对技术优势和劣势的分析。

与XML或JSON的比较很容易使人忽略Protocol Buffers其实是对现有技术的重新实现。除了前面已经提到的,还有一项广泛使用的技术——ASN.1也是其竞争对手。ASN.1虽然已经存在了几十年,却不怎么显山露水。从用ASN.1描述的格式名单来看,这是非常奇怪的一件事情,请看看其中的几种格式:

  • X.509证书(许多系统的PKI都使用,包括SSL)
  • LDAP
  • Cryptographic Message Syntax(CMS)用于电子邮件加密
  • PKCS#1,用于RSA密匙
  • 3G电话网络

ASN.1的用途广泛;例如,日常的电信通信就用到ASN.1编码的数据。ASN.1基于与Protocol Buffers相似的概念——它也用IDL描述数据,用编译器为目标语言生成代码。但两者有一处关键差别——ASN.1允许多种编码方法,可以根据用途来选择。 Canonical Encoding Rules(CER)是其中的一种编码方式,其强制实行严格的编码规则,这对数字签名来说很关键,因为稍有差异就意味着很大的区别,其他可用的编码方式还有Packed Encoding Rules(PER)。 XML Encoding Rules(XER)允许将数据编码成XML,ASN.1也就成了与XML Schema并列的选项。Fast Web Services技术就能把XML Schemas映射成ASN.1,然后用ASN.1在端点之间进行编码效率更高的通信。

还有一种技术与Google的Protocol Buffers相似,那就是Facebook的Thrift,它的工作原理也差不多(见Protocol Buffers与Thrift的逐点对比)。Binary XML也是一种不太成功的类似技术,它已经在XML界酝酿了很久,但成功仍然遥遥无期。Erlang的创造者Joe Armstrong也在回答关于Protocol Buffers的问题时提到可以把UBF用作一种二进制格式直接传输程序字节码,无需解析。

这些技术共同的目标都是提高效率。有人可能觉得在线路上传输的数据量不是问题,因为有数据压缩技术。然而压缩/解压缩只是在使用数据前后执行的额外 步骤,实际的解析过程中使用的仍然是没压缩的大量数据。对于XML来说,意味着一次又一次重复地读取同样的元素标签——简直与Protocol Buffers的数字标签没法比。当然,改善的程度取决于实际的格式。主要由字符串组成的格式效果就没有主要由数字数据组成的格式那么显著。

Mark Pilgirm也整理了一份对Protocol Buffer的反响。还有一个值得注意的方面,从Protocol Buffers身上可以看出一个RPC系统的蛛丝马迹。虽然目前还没有向大众公开,但在Steve Vinoski的博客上有一位Google的员工提到,Google内部确有这样一个RPC系统在担当重任。

分享到:
评论

相关推荐

    protocol buffers 官网中文教程

    3. **编码和解码**:在程序中,你可以创建一个`Person`对象,设置字段值,然后使用生成的API将其序列化为二进制数据。反过来,也可以从二进制数据解码得到`Person`对象。 4. **语言和平台兼容**:由于Protocol ...

    Go-各种传输二进制数据编码格式的Golang示例与比较

    Go语言,作为一款高效、简洁的系统级编程语言,提供了多种用于编码和解码二进制数据的格式。本文将深入探讨四种常见的编码格式在Go中的实现和应用场景:protobuf(Protocol Buffers)、bson(Binary JSON)、json...

    微控制器 的 Json 二进制编码_C++_代码_相关文件_下载

    Protoson 是一个用于以二进制格式对非结构化数据进行编码和解码的库。类似于 JSON,但又快又小。Protoson 基于一些 Protocol Buffers 编码技术,但它在网络上不兼容。但是,您可以将 protoson 输出嵌入到任何 ...

    ProtocolBuffers-谷歌的数据交换格式

    1. **高效性**:protobuf的二进制编码方式比XML或JSON更紧凑,减少了存储和网络传输的成本。 2. **跨平台**:protobuf提供了多种编程语言的支持,包括C++、Java、Python、Go等,方便多语言环境下的数据交换。 3. **...

    Google Protocol Buffers

    相比于手动二进制编码,Protobuf的序列化和反序列化过程具有更明确的效率保证。同时,与XML、JSON等人类可读格式相比,Protobuf在空间和时间效率上都有优势,尽管后者的可读性更强。 Protobuf使用一种简单明了的...

    Protocol buffers 反序列化 一键protoc反序列化

    总结起来,Protocol Buffers反序列化涉及将protobuf格式的二进制数据转换回其原始结构。在处理16进制表示的数据时,需要先将其转换为字节流。工具`tool.exe`可以简化这一过程,提供一键反序列化的功能。同时,了解...

    Protocol Buffers

    相比于XML和JSON,protobuf在体积和速度上具有显著优势,因为它们是二进制格式,而XML和JSON是文本格式。然而,XML和JSON更易于人类阅读和调试,且在Web服务中更常见。选择哪种格式取决于具体的应用场景和需求。 **...

    protocolbuffers的基础编码

    每个类型都有其对应的二进制编码方式。 2. **消息结构**:protobuf定义消息(message)来组织数据,一个消息由一个或多个字段(field)组成。每个字段都有一个唯一的整数标识符(tag),以及一个类型和值。 3. **...

    Protocol Buffers 3.1.0及工具

    protobuf将结构化的数据模型转换为二进制格式,从而节省存储空间和网络带宽。它支持多种编程语言,如C++、Java、Python等,使得不同语言间的数据交换变得简单。 ### 二、protobuf 3.1.0新特性 1. **更强的灵活性**...

    手机端后台向前台传输数据的二进制压缩方法

    在移动应用开发中,数据传输是关键的一环。...通过合理选择二进制编码格式、压缩算法,并利用如`binaryUtil_1.0.jar`这样的工具,开发者可以显著提高应用性能,降低网络负载,同时提升用户满意度。

    C#版protobuf如何实现http方式二进制传输

    Protocol buffers是一种编码方法构造的一种有效而可扩展的格式的数据。 谷歌使用其内部几乎RPC协议和文件格式的所有协议缓冲区。 C#protobuf如何实现http方式二进制传输的一个例子及说明文档

    Protocol Buffers 2.0.0 Beta

    总结起来,Protocol Buffers 2.0.0 Beta是谷歌提供的一种高效、紧凑的数据序列化工具,它通过高效的编码方式和紧凑的数据表示,显著提升了数据交换的速度,降低了存储成本,特别是在XML和其他文本格式无法满足性能...

    第35讲 二进制类RPC协议:还是叫NBA吧,总说全称多费劲1

    总的来说,二进制类RPC协议在数据中心内部服务间的高频率调用中具有显著优势,其高效的数据编码和传输减少了网络资源的消耗,提升了系统性能。Dubbo等实现方式为这种通信模式提供了可靠的实现框架,是现代分布式系统...

    protocolbuffers 2.4.1.521

    在 C# 中使用 Protocol Buffers 可以显著提高数据交换的效率,因为它可以将结构化的数据对象编码为二进制格式,这种格式比文本格式(如 JSON)更小,解析和生成速度更快。这使得 Protobuf 成为网络通信、数据持久化...

    android protocol buffers demo

    Android Protocol Buffers(简称ProtoBuf)是Google开发的一种数据序列化协议,用于高效地编码和解码结构化数据。在Android应用开发中,它被广泛用于数据存储、网络通信和跨平台消息交换,因为它提供了比XML和JSON更...

    xml binary soap 序列化

    2. SOAP二进制编码:SOAP Message Encoding(SOAPME)和SOAP with Binary XML(SWBXML)是两种常见的SOAP二进制编码方式。SOAPME尝试将XML元素和属性转换为更小的二进制表示,而SWBXML则使用一种高效的二进制编码...

    Protocol Buffers 入门应用

    - **持久化存储**:protobuf的二进制格式节省空间,适合存储大量结构化数据。 - **跨平台**:protobuf支持多种编程语言,方便不同语言之间的数据交换。 - **API接口**:作为服务端API的数据交换格式,protobuf提供...

    Protocol Buffers 学习笔记

    4. **编码与解码**:protobuf使用高效的二进制编码方式,比文本格式(如XML、JSON)占用更少的空间和网络带宽。编码过程将消息结构转换为字节流,解码则相反。 ### 二、protobuf的使用场景 1. **数据存储**:...

    C#中使用二进制和ProtoBuf分别进行序列化、反序列化、压缩、解压缩对比测试示例源码.zip

    它使用一种二进制编码规则,使得序列化后的数据更紧凑,适合在网络通信中使用。C#中可以使用Google.Protobuf库来实现ProtoBuf的序列化和反序列化。 在压缩和解压缩方面,示例可能使用了.NET Framework提供的`System...

Global site tag (gtag.js) - Google Analytics