Python使用protobuf序列化和反序列化的实现


Posted in Python onMay 19, 2021

protobuf介绍

protobuf是一种二进制的序列化格式,相对于json来说体积更小,传输更快。

安装protobuf

安装protobuf的目的主要用来将proto文件编译成python、c、Java可调用的接口。

# 如果gcc版本较低,需要升级gcc
wget https://main.qcloudimg.com/raw/d7810aaf8b3073fbbc9d4049c21532aa/protobuf-2.6.1.tar.gz
tar -zxvf protobuf-2.6.1.tar.gz -C /usr/local/ && cd /usr/local/protobuf-2.6.1
./configure 
make && make install
# 可以在/etc/profile或者~/.bash_profile末尾设置永久有效
export PATH=$PATH:/usr/local/protobuf-2.6.1/bin

使用下面命令查看是否安装成功。

[root@CodeOnTheRoad ~]# protoc --version
libprotoc 2.6.1

构建python接口

创建cls.proto文件,定义序列化结构:

package cls;

message Log
{
    message Content
    {
        required string key   = 1; // 每组字段的 key
        required string value = 2; // 每组字段的 value
    }
    required int64   time     = 1; // 时间戳,UNIX时间格式
    repeated Content contents = 2; // 一条日志里的多个kv组合
}

message LogTag
{
    required string key       = 1;
    required string value     = 2;
}

message LogGroup
{
    repeated Log    logs        = 1; // 多条日志合成的日志数组
    optional string contextFlow = 2; // 目前暂无效用
    optional string filename    = 3; // 日志文件名
    optional string source      = 4; // 日志来源,一般使用机器IP
    repeated LogTag logTags     = 5;
}

message LogGroupList
{
    repeated LogGroup logGroupList = 1; // 日志组列表
}

只用下面命令将proto文件转换为python可调用的接口。

protoc cls.proto --python_out=./

执行完后,在此目录下生成cls_pb2.py。

序列化

import cls_pb2 as cls
import time

# 构建protoBuf日志内容
LogLogGroupList = cls.LogGroupList()

LogGroup = LogLogGroupList.logGroupList.add()
LogGroup.contextFlow = "1"
LogGroup.filename = "python.log"
LogGroup.source = "localhost"

LogTag = LogGroup.logTags.add()
LogTag.key = "key"
LogTag.value = "value"

Log = LogGroup.logs.add()
Log.time = int(round(time.time() * 1000000))

Content = Log.contents.add()
Content.key = "Hello"
Content.value = "World"
print(LogLogGroupList)
# 序列化
data = LogLogGroupList.SerializeToString()
print(data)

其实就是讲一个protobuf的结构文本序列化成了二进制的形式。

反序列化

反序列化就是将二进制转换成protobuf结构。

# 反序列化
LogLogGroupList = cls.LogGroupList()
LogLogGroupList.ParseFromString(data)
print(LogLogGroupList)

运行结果

上面序列化和反序列化代码结果运行如下:

Python使用protobuf序列化和反序列化的实现

到此这篇关于Python使用protobuf序列化和反序列化的实现的文章就介绍到这了,更多相关Python 序列化和反序列化内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python发送邮件接收邮件示例分享
Jan 21 Python
用Python编写分析Python程序性能的工具的教程
Apr 01 Python
Python每天必学之bytes字节
Jan 28 Python
python生成器,可迭代对象,迭代器区别和联系
Feb 04 Python
python监控进程脚本
Apr 12 Python
Python实用技巧之列表、字典、集合中根据条件筛选数据详解
Jul 11 Python
python实现QQ批量登录功能
Jun 19 Python
程序员的七夕用30行代码让Python化身表白神器
Aug 07 Python
Python中Unittest框架的具体使用
Aug 27 Python
Python如何使用turtle库绘制图形
Feb 26 Python
python实现语音常用度量方法的代码详解
May 25 Python
解决IDEA翻译插件Translation报错更新TTK失败不能使用
Apr 24 Python
详解分布式系统中如何用python实现Paxos
May 18 #Python
如何在向量化NumPy数组上进行移动窗口
Python如何配置环境变量详解
Python打包为exe详细教程
Python基础之数据类型知识汇总
May 18 #Python
Python实战之疫苗研发情况可视化
Python打包exe时各种异常处理方案总结
You might like
UCenter 批量添加用户的php代码
2012/07/17 PHP
PHP程序级守护进程的实现与优化的使用概述
2013/05/02 PHP
Prototype 学习 工具函数学习($w,$F方法)
2009/07/12 Javascript
JQuery autocomplete 使用手册
2010/04/01 Javascript
javascript 学习笔记(一)DOM基本操作
2011/04/08 Javascript
解决3.01版的jquery.form.js中文乱码问题的解决方法
2012/03/08 Javascript
javascript实现依次输入input自动定焦
2014/12/23 Javascript
详解js中构造流程图的核心技术JsPlumb(2)
2015/12/08 Javascript
浅谈javascript中的constructor
2016/06/08 Javascript
javascript时间差插件分享
2016/07/18 Javascript
微信小程序使用第三方库Immutable.js实例详解
2016/09/27 Javascript
JS获取年月日时分秒的方法分析
2016/11/28 Javascript
jquery实现图片上传前本地预览
2017/04/28 jQuery
js制作简单的音乐播放器的示例代码
2017/08/28 Javascript
原生JS实现 MUI导航栏透明渐变效果
2017/11/07 Javascript
深入浅析Vue中的Prop
2018/06/10 Javascript
apicloud拉起小程序并传递参数的方法示例
2018/11/21 Javascript
Vue-cli4 配置 element-ui 按需引入操作
2020/09/11 Javascript
如何构建一个Vue插件并生成npm包
2020/10/26 Javascript
举例讲解Django中数据模型访问外键值的方法
2015/07/21 Python
Python设计模式之命令模式简单示例
2018/01/10 Python
Python3匿名函数用法示例
2018/07/25 Python
Django异步任务之Celery的基本使用
2019/03/23 Python
使用python对多个txt文件中的数据进行筛选的方法
2019/07/10 Python
python自动保存百度盘资源到百度盘中的实例代码
2019/08/26 Python
解决python DataFrame 打印结果不换行问题
2020/04/09 Python
8种常用的Python工具
2020/08/05 Python
python MD5加密的示例
2020/10/19 Python
pyx文件 生成pyd 文件用于 cython调用的实现
2021/03/04 Python
快速一键生成Python爬虫请求头
2021/03/04 Python
英国时尚泳装品牌:Maru Swimwear
2019/10/06 全球购物
毕业生幼师求职自荐信
2013/10/01 职场文书
初中班主任经验交流材料
2014/05/16 职场文书
2014乡镇班子个人对照检查材料思想汇报
2014/09/26 职场文书
教师节联欢会主持词
2015/07/04 职场文书
青年人初次创业的“五不要”
2019/08/23 职场文书