https://developers.google.com/protocol-buffers
什么是protobufprotobuf就是一个序列化&反序列化工具包,因为是二进制协议所以效率较高,并且支持众多语言跨语言通信。和json,xml等协议的区别在于他需要通过.proto文件定义接口协议,然后用proto工具生成的收发方代码来进行序列化反序列化。(这种方式效率更高因为双方需要通过生成的代码来处理序列化内容等于双方都知道字节流的“结构”了收到以后只需要读取字段的“内容”,而不需要像json这样收到以后再解析判断结构)
安装(官网github代码目录下有官方安装指引)官网可以下载解压包,下载并且tar -zxf解压即可。
解压完的目录下按照下面执行make,$INSTALL_DIR 代表你想要安装的目录
./configure --prefix=$INSTALL_DIR make make check make install
安装结束之后,安装目录下的bin文件夹下就是protobuff的可执行进程了。
上手例子 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表示复杂信息结构体,可以嵌套使用。
接下来使用这条命令读取proto文件创建代码
protoc -I=$SRC_DIR --cpp_out=$DST_DIR $SRC_DIR/addressbook.proto
其中,DST_DIR是序列化反序列化代码的生成目录 SRC_DIR是proto文件的目录。不填的话默认都用当前目录。
3 使用生成代码用于序列化&反序列化首先序列化写入文件
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import test_pb2
def 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())
return
if __name__ == "__main__":
test()
pass
然后读取文件并且反序列化
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import test_pb2
def test():
person = test_pb2.Person()
with open("file.txt", "rb") as f:
person.ParseFromString(f.read())
print (person)
data = person.phones
print (data[0])
if __name__ == "__main__":
test()
pass
结尾吐槽
官网例子不知道为啥是proto2没有proto3的十分无语。。



