ProtoBuf简介

简介

这篇文章浅显地介绍一下Google的数据序列化协议:ProtoBuf(Protocol Buffers),并通过一个简单的例子,展示如何使用这个协议。

数据序列化协议

数据序列化协议用于将数据结构序列化成可方便存储、传输的格式,ProtoBuf是一个被广泛使用的序列化协议,它拥有下面一些优点:

  1. 二进制协议,相比json或xml而言体积小
  2. 使用方便,使用proto工具直接生成可使用的代码

示例

使用ProtoBuf的步骤可以分为这么几步:

  1. 定义山上描述文件*.proto
  2. 生成用于操作数据的代码
  3. 调用生成的代码进行序列化或者反序列化

下面通过一个示例来演示ProtoBuf的简单使用。

编写.proto文件

.proto文件描述了消息的结构,.proto文件的编写语法见这个链接,这里我直接贴上:

syntax = "proto2";

package tutorial;

message Person {
  optional string name = 1;
  optional string email = 3;
}

将上述内容存储为person.proto文件,可以看到,我们在文件中定义了Person这个消息类型,这个消息有两个可选属性nameemail

生成用于操作数据的代码

执行下面代码即可生成:

$ 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 = "[email protected]"

print('The message: ')
print(p)

print('The serialized message')
print(p.SerializeToString())

运行上面的序列化代码:

❯ python serialize.py           
The message: 
name: "Charles"
email: "[email protected]"

The serialized message
b'\n\x07Charles\x1a\[email protected]'

可以看到,调用SerializeToString之后,构建的Person对象被序列化成了二进制形式。

反序列化

反序列化可以通过调用ParseFromString来做到:

from person_pb2 import Person

p = Person()
p.name = "Charles"
p.email = "[email protected]"

serialized = p.SerializeToString()

parsed = Person()
parsed.ParseFromString(serialized)
print('parsed:')
print(parsed)

执行结果:

❯ python deserialize.py
parsed:
name: "Charles"
email: "[email protected]"

(691条消息) ProtoBuf简介_sha256sum的博客-CSDN博客_protobuf

你可能感兴趣的:(Serialization,python,json,java)