protobuf(proto3)极简入门(python为例)
官网入口
https://developers.google.com...
什么是protobuf
protobuf就是一个序列化&反序列化工具包,因为是二进制协议所以效率较高,并且支持众多语言跨语言通信。和json,xml等协议的区别在于他需要通过.proto文件定义接口协议,然后用proto工具生成的收发方代码来进行序列化反序列化。(这种方式效率更高因为双方需要通过生成的代码来处理序列化内容等于双方都知道字节流的“结构”了收到以后只需要读取字段的“内容”,而不需要像json这样收到以后再解析判断结构)
安装(官网github代码目录下有官方安装指引)
1 开始安装前先安装yum的开发工具包
yum -y groupinstall "Development Tools"
2
官网下载解压包,下载并且tar -zxf解压即可。解压完的目录下按照下面执行,其中$INSTALL_DIR 代表你想要安装的目录
./configure --prefix=$INSTALL_DIR
make
make check
make install
安装结束之后,安装目录下的bin文件夹下就是protobuff的可执行进程了。
3 本地的python环境要安装google包和protobuf包
pip install google
pip install protobuf
上手例子 1 proto文件准备 先写一个proto协议文件然后用protoc读取proto文件生成序列化&反序列化代码。
syntax = "proto3";
package tutorial;
message Person {
optional string name = 1;
optional int32 email = 2;
enum PhoneType {
MOBILE = 0;
HOME = 1;
}
message PhoneNumber {
optional string number = 1;
optional PhoneType type = 2;
}
repeated PhoneNumber phones = 4;
}
syntax = "proto3"表示使用proto3版本,默认proto2.
optional表示这个字段是可以选的。enum表示枚举类型,message表示复杂信息结构体,可以嵌套使用。
2 使用proto文件生成序列化&反序列化代码 接下来使用这条命令读取proto文件创建代码
protoc -I=$SRC_DIR --python_out=$DST_DIR addressbook.proto
其中,DST_DIR是序列化反序列化代码的生成目录 SRC_DIR是proto文件的目录。不填的话默认都用当前目录。
生成python的代码就用python_out
3 使用生成代码用于序列化&反序列化 首先序列化写入文件
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import test_pb2def test():
person = test_pb2.Person()
person.name = "123"
person.email = 123
phone = person.phones.add()
phone.number = "2345"
phone.type = person.PhoneType.HOME
with open("file.txt", "wb") as f:
f.write(person.SerializeToString())
returnif __name__ == "__main__":
test()
pass
然后读取文件并且反序列化
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import test_pb2def test():
person = test_pb2.Person()
with open("file.txt", "rb") as f:
person.ParseFromString(f.read())
print (person)
data = https://www.it610.com/article/person.phones
print (data[0])if __name__ =="__main__":
test()
pass
结尾吐槽 【protobuf(proto3)极简入门(python为例)】官网例子不知道为啥是proto2没有proto3的十分无语。。
推荐阅读
- 极简主义|极简主义 简记
- 《极简思维》——2day
- 极简生活(三)
- Netty|Netty 示例6 集成Protobuf
- 《极简生活(简而美地活》阅读笔记)
- ffmpeg|从零开始仿写一个抖音App——基于FFmpeg的极简视频播放器
- protobuf编码详解
- 极简,是主动选择简朴
- 极简实现 TiDB 冷热数据分层存储 | He3 团队访谈
- 极简的Android RecyclerView Adapter(使用DataBinding)