python解析和打包protobuf

概述

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 http://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

google.protobuf.message

在Python 3.4里使用Protobuf 2.6

Language Guide (proto3)

python解析和打包protobuf》上有2条评论

发表评论

电子邮件地址不会被公开。