Protobuf协议特点分析 KingKa.吴永聪 1、protobuf是什么? protobuf(Google Protocol Buffers)是Google提供的一个具有高效的协议数据交换格式工具库(类似Json和Xml),但相比于Json,Protobuf有更高的转化效率,其时间效率和空间效率都是JSON的3-5倍。其最大的特点是基于二进制,因此比传统的一些XML表示的效率要高出不少。虽然protobuf是二进制的数据格式,但是并没有因为这样变得复杂,我们可以通过它的语法来定义结构化的消息格式,然后根据命令行工具编译生成相关的.proto文件,支持的语言有java、C++、Python等语言。把生成的.proto文件直接放在项目里面,就可以调用相关方法来完成业务消息的序列化和反序列化的工作,整个占据大小在。 2、Protobuf的主要特点: (1)跨平台,支持大多数语言开发(Java、object-c、c++、c、php、python、go等),代码开源,运行稳定可靠,谷歌内部使用(后台强) (2)性能好,效率高,占据空间和运行时间相比json和xml小,二进制序列化格式,数据压缩紧凑,占据字节数小 (3) 支持向后兼容和向前兼容 注:【“向后兼容”(backward compatible),就是说,当模块B升级了之后,它能够正确识别模块A发出的老版本的协议。由于老版本没有“状态”这个属性,在扩充协议时,可以考 虑把“状态”属性设置成非必填 的,或者给“状态”属性设置一个缺省值。“向前兼容”(forward compatible),就是说,当模块A升级了之后,模块B能够正常识别模块A发出的新版本的协议。这时候,新增加的“状态”属性会被忽略。】 (4)适合对数据大和传输速率比较敏感的场合使用。 (5)Protobuf 语义更清晰,无需类似 XML 解析器的东西(因为 Protobuf 编译器会将 .proto 文件编译生成对应的数据访问类以对 Protobuf 数据进行序列化、反序列化操作)。 (6)在项目工程中只需要添加一个由编译器库生成的.proto文件(该文件相当于确定数据协议,数据结构中存在哪些数据,数据类型是怎么样),该文件大小与编译前定义多少结构化数据正相关,以c语言为例,在工程中的protobuf表现形式就是一个.pb-c.c 和 .pb-c.h两个文件,包含进工程即可,跟普通的c文件和h文件一样,编译器编译前大小在5k左右。 (7)支持绝大数数据类型,如下图所示: (8)数据结构化定义灵活,可嵌套定义 3、相比json、xml的优势和不足 谷歌官方测试对比优势: (1) 运行时间 (2)压缩后占据空间字节大小 (3)同 XML 相比, Protobuf 的主要优点在于性能高。它以高效的二进制方式存储,比 XML 小 3 到 10 倍,快 20 到 100 倍。 Protobuf的不足: (1)二进制可读性差 (2)缺乏自描述,二进制的协议内容必须配合.proto文件的定义才有含义,否则不能知道定义的数据内容是干嘛用的。 其他链接: (1)protobuf 性能对比测试:http://agapple.iteye.com/blog/859052 (2)谷歌官方protobuf说明: