Protocol Buffers 是 Google 公司开发的一种轻便高效的结构化数据存储格式,能够用于结构化数据串行化,或者说序列化。它很适合作数据存储或 RPC 数据交换格式。可用于通信协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。python
Protocol Buffers 简称为 protobuf 或 pb,下面是使用 python 解析 pb。linux
$ ./configure $ make $ sudo make install
protoc --version
,显示当前版本:libprotoc x.x.x
pip install protobuf
Protobuf 语义清晰,无需相似 XML 解析器的东西(由于 Protobuf 编译器会将 .proto 文件编译生成对应的数据访问类以对 Protobuf 数据进行序列化、反序列化操做)。git
protoc --python_out=./ ./文件名.proto
这时会在当前目录生成一个与文件名同名的目录,该目录下会有一个 .py
文件。这个文件会用做模块、解析规则去解析 pb 的源数据。github
from test_pb import Test # 从刚才编译出来的 py 文件中 import 解析的类 message = Test() with open('test.pb', 'rb') as fb: pb_content = fb.read() # 若是文件很大,则要分批读取 # pb_content 是二进制的pb数据,若是是文件,则须要用 open 方法读取数据 message.ParseFromString(pd_content) print message
from test_pb import Test # 从刚才编译出来的 py 文件中 import 解析的类 message = Test() message.name = 'hello world' # 赋值 with open('test.pb', 'wb') as fb: # 序列化,写入文件 fb.write(person.SerializeToString())
当 probuf 的数据包含中文时,解析后对于阅读十分不友好。同时若是想要把 probuf 对象转化成 dict 进行后续操做的话。能够试试第三方库:protobuf-to-dict,这个库能够很方便的把 probuf 的数据转化成 dict。示例代码以下:google
from protobuf_to_dict import protobuf_to_dict my_message = MyMessage() # pb_my_message is a protobuf string my_message.ParseFromString(pb_my_message) protobuf_to_dict(my_message) # 输出:{'message': 'Hello'}
这篇文章只是使用 python 简单的解析、序列化。更多细节以及原理推荐阅读Google Protocol Buffer 的使用和原理code
google.protobuf.message.DecodeError: Truncated message.
:首先要保证 pb source 为二进制的数据,不然会出现各类非预期错误