官网入口

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_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的十分无语。。


开水里遨游的咸鱼
0 声望0 粉丝