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源代码
#wget https://protobuf.googlecode.com/files/protobuf-2.5.0.tar.gz

如果下载不了,可以使用附件中的版本:protobuf-2-5-0-tar (github的版本有问题,编了3个多小时也没成功,用这个附件一次就ok了)

2. 解压,编译,安装
#tar zxvf protobuf-2.5.0.tar.gz
#cd protobuf-2.5.0
#./configure
#make
#make check
#make install

3. 继续安装protobuf的python模块(如果不用python,可跳过这一步)
#cd ./python
#python setup.py build
#python setup.py test
#python setup.py install

(如遇到需要安装setuptools的情况,可以使用python的包管理工具—pip或wget –no-check-certificate https://pypi.python.org/packages/source/s/setuptools/setuptools-12.0.3.tar.gz解压后python setup.py install进行安装)

4. 安装完成,验证Linux命令
#protoc –version

5. 验证Python模块是否被正确安装
#python
>>>import google.protobuf
如果没有报错,说明安装正常。

error: package directory ‘google/protobuf/compiler’ does not exist
解决办法:在google/protobuf/下创建compiler文件夹,再次在protobuf文件夹下运行:python setup.py install

6. 根据test.proto生成python类test_pb2.py
#protoc –python_out=./ ./test.proto
示例文件:test.zip

7.解析测试
from test_pb2 import Test
test = Test()
test.siteid=1
print test.SerializeToString()

函数说明:
SerializeToString(): 序列化这个message和以字符串的方式返回。 注意,这是二进行字节,不是一个文本; 我们只使用str类型作为一个方便的容器。
ParseFromString(data): 从给出的字符串中解析一条message。

参考:

http://blog.csdn.net/losophy/article/details/17006573

https://github.com/google/protobuf/tree/master/src

https://developers.google.com/protocol-buffers/docs/reference/python/google.protobuf.message.Message-class

《python解析和打包protobuf》有2个想法

发表评论

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