首页 技术 正文
技术 2022年11月18日
0 收藏 376 点赞 2,876 浏览 1318 个字

 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)支持绝大数数据类型,如下图所示:

(62)通信协议之一protobuf

(8)数据结构化定义灵活,可嵌套定义

3、相比json、xml的优势和不足

谷歌官方测试对比优势:

(1) 运行时间

(62)通信协议之一protobuf

(2)压缩后占据空间字节大小

(62)通信协议之一protobuf

(3)同 XML 相比, Protobuf 的主要优点在于性能高。它以高效的二进制方式存储,比 XML 小 3 到 10 倍,快 20 到 100 倍。

Protobuf的不足:

(1)二进制可读性差

(2)缺乏自描述,二进制的协议内容必须配合.proto文件的定义才有含义否则不能知道定义的数据内容是干嘛用的。

其他链接:

1protobuf 性能对比测试:http://agapple.iteye.com/blog/859052

2谷歌官方protobuf说明:

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,104
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,580
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,428
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,200
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,835
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,918