记录并学习python实现protobuf协议传输
1.protobuf协议是什么?
官方解释:
protocol buffers 是一种与语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。Protocol Buffers 是一种灵活,高效,自动化机制的结构数据序列化方法-可类比 XML,但是比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单。你可以定义数据的结构,然后使用特殊生成的源代码轻松地在各种数据流中使用各种语言进行编写和读取结构数据。你甚至可以更新数据结构,而不破坏由旧数据结构编译的已部署程序。
ProtoBuf也是一种支持序列化反序列化的方法,并且他具有很多优点:
- 多语言
- 多平台
- 体积小
- 扩展好
2.实践,上才艺!
ProtoBuf是跨语言的,使用ProtoBuf的第一步是先定一个proto 文件,而由于ProtoBuf 2和3语言版本的不同,其定义格式会有所不同,具体的细节还是得参考官方文档:https://developers.google.cn/protocol-buffers/docs/proto3
对于ProtoBuf 3 的定义文档我们可以按如下方法定义:
新建test.proto文件,拷贝如下的代码
syntax = "proto3";//指定版本为proto3,默认为proto2
message SearchRequest {
string query = 1;
int32 page_number = 2;
repeated int32 result = 3;
}
其中message关键字是定义的文件名,而 string、int32则是预定的字段类型,repeated则是描述字段为可重复任意多次的字段。
ProtoBuf通过这种形式的文件定义了传输信息的文件结构。
ProtoBuf为每一种语言提供一个生成器protoc。通过使用protoc则可以根据.proto文件生成为一组文件。对应的python语法,我们使用以下命令进行编译:
protoc --proto_path=./ --python_out=./ test.proto
执行命令以后,我们会在当前文件夹看到生成了一个test_pb2.py的编译文件
拿到编译文件之后,我们可以根据编译好的文件进行序列化和反序列化。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import test_pb2
# 实例化协议对象
ser = test_pb2.SearchRequest()
ser.query = "哈哈哈"
ser.page_number = 999
list1 = ser.result
list1.append(5)
list1.append(6)
list1.append(7)
# 对数据进行序列化
data = ser.SerializeToString()
# 对已经序列化的数据进行反序列化
target = test_pb2.SearchRequest()
# 反序列化
target.ParseFromString(data)
print(target.query)
print(target.page_number)
print(target.result)
输出结果
哈哈哈
999
[5, 6, 7]
至此,我们实现了通过protobuf进行序列化和反序列化!加油,奥力给!