1.ProtoBuf: 是一套完整的 IDL(接口描述语言),出自Google,基于 C++ 进行的实现,开发人员可以根据 ProtoBuf 的语言规范生成多种编程语言(Golang、Python、Java 等)的接口代码
据说 ProtoBuf 所生成的二进制文件在存储效率上比 XML 高 3~10 倍,并且处理性能高 1~2 个数量级,这也是选择 ProtoBuf 作为序列化方案的一个重要因素之一。
RPC通信编解码库对比:json、flatbuf、protobuf、MessagePack_messagepack和protobuf对比-CSDN博客
2.使用
1)下载编译器
Releases · protocolbuffers/protobuf · GitHub
并配置系统环境路径
2)安装python库
pip install protobuf
3)定义对应的文件addressbook.proto
syntax = "proto3"; // 指定使用Protocol Buffers版本3(proto3)语法。// 定义一个名为Person的消息类型。
message Person {string name = 1; // 字符串类型的字段,表示Person的名字,字段编号为1。int32 id = 2; // 32位整数类型的字段,表示Person的ID,字段编号为2。string email = 3; // 字符串类型的字段,表示Person的电子邮件地址,字段编号为3。
}// 定义一个名为AddressBook的消息类型。
message AddressBook {repeated Person people = 1; // 一个可重复的Person类型的字段,表示多个Person对象的列表,字段编号为1。
}
4)编译.proto文件
protoc --python_out=. addressbook.proto
5)使用生成的Python代码
import addressbook_pb2# 创建一个新的AddressBook
address_book = addressbook_pb2.AddressBook()# 添加一个Person
person = address_book.people.add()
person.name = "John Doe"
person.id = 1234
person.email = "johndoe@example.com"# 序列化AddressBook到二进制字符串
serialized_data = address_book.SerializeToString()# 打印序列化后的数据
print("Serialized data:", serialized_data)# 反序列化二进制字符串到新的AddressBook对象
new_address_book = addressbook_pb2.AddressBook()
new_address_book.ParseFromString(serialized_data)# 打印反序列化后的数据
for person in new_address_book.people:print("Name:", person.name)print("ID:", person.id)print("Email:", person.email)
得到结果
Serialized data: b'\n\x0e\n\x07John Doe\x10\xd2\x09\x1a\x10johndoe@example.com'
Name: John Doe
ID: 1234
Email: johndoe@example.com
Protobuf协议初级详解(python使用)从安装到序列化-反序列化_python protobuf-CSDN博客