简介
这篇文章浅显地介绍一下Google的数据序列化协议:ProtoBuf(Protocol Buffers),并通过一个简单的例子,展示如何使用这个协议。
数据序列化协议
数据序列化协议用于将数据结构序列化成可方便存储、传输的格式,ProtoBuf是一个被广泛使用的序列化协议,它拥有下面一些优点:
- 二进制协议,相比json或xml而言体积小
- 使用方便,使用
proto
工具直接生成可使用的代码
示例
使用ProtoBuf的步骤可以分为这么几步:
- 定义山上描述文件
*.proto
- 生成用于操作数据的代码
- 调用生成的代码进行序列化或者反序列化
下面通过一个示例来演示ProtoBuf的简单使用。
编写.proto文件
.proto
文件描述了消息的结构,.proto
文件的编写语法见这个链接,这里我直接贴上:
syntax = "proto2";
package tutorial;
message Person {
optional string name = 1;
optional string email = 3;
}
将上述内容存储为person.proto
文件,可以看到,我们在文件中定义了Person
这个消息类型,这个消息有两个可选属性name
和email
。
生成用于操作数据的代码
执行下面代码即可生成:
$ protoc protoc -I=$DATA_DIR --python_out=$DATA_DIR $DATA_DIR/person.proto
其中$DATA_DIR
表示person.proto
所在目录,--python_out
表明我们希望生成python代码,输出目录同样是$DATA_DIR
,执行完之后,会在$DATA_DIR
目录下生成person_pb2.py
文件,其中有操作消息需要用到的代码。
❯ ls
person.proto person_pb2.py
调用代码
数据序列化
from person_pb2 import Person
p = Person()
p.name = "Charles"
p.email = "nobody@gmail.com"
print('The message: ')
print(p)
print('The serialized message')
print(p.SerializeToString())
运行上面的序列化代码:
❯ python serialize.py
The message:
name: "Charles"
email: "nobody@gmail.com"
The serialized message
b'\n\x07Charles\x1a\x10nobody@gmail.com'
可以看到,调用SerializeToString
之后,构建的Person
对象被序列化成了二进制形式。
反序列化
反序列化可以通过调用ParseFromString
来做到:
from person_pb2 import Person
p = Person()
p.name = "Charles"
p.email = "nobody@gmail.com"
serialized = p.SerializeToString()
parsed = Person()
parsed.ParseFromString(serialized)
print('parsed:')
print(parsed)
执行结果:
❯ python deserialize.py
parsed:
name: "Charles"
email: "nobody@gmail.com"