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 = "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"
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值