Google数据通信协议Protocol Buffers

Protocol Buffers:一种可扩展的序列化结构化数据的方式,语言中立,平台中立并被用于通信协议,数据存储等许多方面的数据协议,想想XML,JSON,但是比XML更小巧,更简单,更快捷

protocol buffers是一个灵活的,高效的,用于序列化结构化数据的自动机制。你只需要一次性定义好你希望数据如何被组织,然后你可以用特别生成的源代码使用各种各样的语言方便地对多种多样的数据流进行读和写。你甚至可以在不破坏以“旧”格式编译的已部署的程序的情况下,更新你的数据结构。

常见的跨进程/机器界线序列化对象的技术有:

  • 本地序列化,以所使用语言比如Java,C++等等的本地实现来序列化对象
  • 使用自定义的序列化格式来进行序列化
  • 将数据序列化为XML

这些方案每个都有其自身的问题存在,比如本地序列化意味着在序列化管道的末端必须是同样的平台,以保证能实体化序列化的对象,XML被认为是一种冗长而效率低下的序列化格式,而自定义序列化格式会因开发一次性的语法分析器而带来成本的增加。

Protocol buffers的目标就是针对这一问题的灵活,高效而自动的解决方案。利用protocol buffers,你对需要存储的数据结构编写一个.proto描述文件。Protocol buffer编译器据此创建一个实现自动编码的类并且以一种高效的二进制格式来分析protocol buffer数据。所生成的类为组成protocol buffer的字段提供了getter和setter,并且处理了将这一protocol buffer作为单元来读取和写入的细节.更重要的是,protocol buffer格式支持随着时间对格式进行扩展的概念,以这种方式代码仍然可以读取以旧格式编码的数据。

Protocol buffers支持如下的可以被“对象”图表达的基本数据类型

  • 基本的128 Varint表示-int32,int64,uint32,uint64,sint32,sint64,bool,enum(Varints是使用一个或多个字节来序列化整数的一种方法。小的数值占用更小的字节。)
  • 固定大小的64位表示-fixed64,sfixed64,double
  • 固定大小的表示-string,bytes,嵌入消息,打包的重复字段
  • 固定大小的32位表示-fixed32,sfixed32,float

一个序列化单元是一条包含由基本数据类型或嵌入消息所组成字段的消息。Protocol buffers支持可选的,必需的和重复的字段。一个使用protocol buffers来定义的地址簿消息看起来可能像这样

package tutorial;message Person { required string name = 1; required int32 id = 2; optional string email = 3; enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber { required string number = 1; optional PhoneType type = 2 [default = HOME]; } repeated PhoneNumber phone = 4;}message AddressBook { repeated Person person = 1;}

消息定义语言的特性在语言指南里面作出了描述。当使用protocol buffer编译器进行编译时,编码器和语法分析器用一种私有的高效序列化格式产生。当前的发布版包括了编译器以及用于C++,Java和Pyhon的API。同时还有社区项目力图为Protocol Buffers加入新的语言实现,包括Perl,C#,以及Ruby。

优点

1. 定于语言体积小,支持多种数据类型,如list,支持嵌套
2. 定义过程中可以使用类型的概念,可以在使用的时候检查类型合法性
3. 可以将一个描述文件,生成多种语言的代码,使数据的读写实现了语言无关。
4. 如果描述文件修改了,只要遵守一定的规则,那原有数据结构对应的数据,也是可以被成功读取的。

缺点

1. 序列化后的文件不可读。
2. 不可与xml或者json进行相互转化

场景...

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值