栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

protobuf(proto3)极简入门(python)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

protobuf(proto3)极简入门(python)

protobuf(proto3)极简入门(python) 官网入口

https://developers.google.com/protocol-buffers

什么是protobuf

protobuf就是一个序列化&反序列化工具包,因为是二进制协议所以效率较高,并且支持众多语言跨语言通信。和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表示复杂信息结构体,可以嵌套使用。

2 使用proto文件生成序列化&反序列化代码

接下来使用这条命令读取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的十分无语。。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/348433.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号