概述
Protocol Buffers,简称protobuf或pb,是Google公司开发的一种数据描述语言,类似于XML和JSON能够将结构化数据序列化用于数据存储、通信协议等方面。目前官方支持C++、JAVA、Python等三种编程语言。
与XML和JSON相比,protobuf在配置时将数据key映射为递增数字,使用二进制传输,并能够根据schema自动生成各语言的打包、解析回kv的代码,非常方便各语言数据互通,且有以下优点:
1. 数据文件只需原来的1/10至1/3 #相同的数据,大小只有json的1/10
2. 解析速度是原来的20倍至100倍
3. 通过递增数字做key传输value,减少了二义性,在接口发生变化时完全像后兼容
4. 非常容易自动生成各语言中使用的数据访问类,将数据key根据schema自动转回易理解的英文key
protobuf不是用来替代json和xml的,它最初的目的是为了更小的带宽占用、更快的传输速度,所以使用数据key+二进制传输,也产生了一些缺点:
1. 对人不可读。(适合加密数据传输)
2. 不能发给web浏览器,比如js无法处理这种数据。(适合c、java、python语言开发的程序间共享数据)
3. 开发适配成本高,不适合schema经常变的场景。(适合公司内部各产品间相对通用稳定的协议通信)
安装和使用
前提:需要gcc, gcc-c++, make, build等编译环境
yum -y install gcc gcc-c++ libstdc++-devel make build
1. 下载protobuf源代码
# proto2用下边这个包
wget https://blog.yanjingang.com/wp-content/uploads/2016/09/protobuf-2.5.0.tar.gz
# proto3直接用最新release版即可:https://github.com/protocolbuffers/protobuf/releases
wget https://github.com/protocolbuffers/protobuf/releases/download/v3.11.4/protobuf-all-3.11.4.tar.gz
*注:使用python3+proto2时,python的protobuf库版本兼容性问题能把人折麽死(proto2主要为python2开发,最后一次发布是14年,对python3的兼容性极差),建议别在这个事情上浪费时间了,如果当前用的proto2,要么升级proto版本到3,要么降python版本到2。
2. 解压,编译,安装
tar zxvf protobuf-3.11.4.tar.gz
cd protobuf-3.11.4
./configure
make
make check
make install
3. 安装完成,验证Linux命令
protoc --version
>>libprotoc 3.11.4
4. 继续安装protobuf的python模块(如果不用python,可跳过这一步)
cd ./python python setup.py build python setup.py test python setup.py install
5. 验证Python模块是否被正确安装
python
>>>import google.protobuf
6. 根据test.proto生成python类test_pb2.py
# 配置test.proto syntax="proto3"; package test.abc; //Test message Test { string name = 1; uint32 speed = 2; State state = 3; float time = 5; bytes content = 6; enum State { STATE_OFF = 0; STATE_STANDBY = 1; STATE_READY = 2; } }; # 生成pythhon类
protoc --python_out=./ ./test.proto #--python_out=生成的python文件输出路径 对应的proto文件
7.解析测试
from test_pb2 import Test
test = Test()
test.name='A'
# 转pb
msg = test.SerializeToString() #序列化这个message和以字符串的方式返回。 注意,这是二进行字节,不是一个文本; 我们只使用str类型作为一个方便的容器。
print(msg)
# 解析pb
test.ParseFromString(msg) #从给出的字符串中解析一条message
print(test)
8.其他
如有前端js解析proto的需求,可以使用 protobuf.js 。
参考:
在Python中使用protocol buffers参考指南
https://github.com/protocolbuffers/protobuf/tree/master/src
访问您的博客已成习惯!
来看看,学习学习!!