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模拟登陆Tom邮箱示例分享
Jan 13 Python
浅析python中的分片与截断序列
Aug 09 Python
Python实现按学生年龄排序的实际问题详解
Aug 29 Python
浅谈python爬虫使用Selenium模拟浏览器行为
Feb 23 Python
python删除字符串中指定字符的方法
Aug 13 Python
python文本数据处理学习笔记详解
Jun 17 Python
pandas的qcut()方法详解
Jul 06 Python
为什么说Python可以实现所有的算法
Oct 04 Python
python3反转字符串的3种方法(小结)
Nov 07 Python
PyCharm GUI界面开发和exe文件生成的实现
Mar 04 Python
利用python控制Autocad:pyautocad方式
Jun 01 Python
详解PyQt5中textBrowser显示print语句输出的简单方法
Aug 07 Python
详解分布式系统中如何用python实现Paxos
May 18 #Python
如何在向量化NumPy数组上进行移动窗口
Python如何配置环境变量详解
Python打包为exe详细教程
Python基础之数据类型知识汇总
May 18 #Python
Python实战之疫苗研发情况可视化
Python打包exe时各种异常处理方案总结
You might like
第六章 php目录与文件操作
2011/12/30 PHP
PHP基础知识介绍
2013/09/17 PHP
PHP间隔一段时间执行代码的方法
2014/12/02 PHP
php使用GD创建保持宽高比缩略图的方法
2015/04/17 PHP
PHP接收App端发送文件流的方法
2016/09/23 PHP
javascript实现 在光标处插入指定内容
2007/05/25 Javascript
javascript:以前写的xmlhttp池,代码
2008/05/18 Javascript
IE innerHTML,outerHTML所引起的问题
2009/06/04 Javascript
JS调用CS里的带参方法实例
2013/08/01 Javascript
javascript dom追加内容实现示例
2013/09/21 Javascript
JS、CSS以及img对DOMContentLoaded事件的影响
2014/08/12 Javascript
jQuery+PHP实现动态数字展示特效
2015/03/14 Javascript
javascript等号运算符使用详解
2015/04/16 Javascript
Node.js中npm常用命令大全
2016/06/09 Javascript
js 基础篇必看(点击事件轮播图的简单实现)
2016/08/20 Javascript
Bootstrap企业网站实战项目4
2016/10/14 Javascript
将鼠标焦点定位到文本框最后(代码分享)
2017/01/11 Javascript
vue系列之动态路由详解【原创】
2017/09/10 Javascript
vue中如何实现pdf文件预览的方法
2018/07/12 Javascript
vue工程全局设置ajax的等待动效的方法
2019/02/22 Javascript
解决在layer.open中使用时间控件laydate失败的问题
2019/09/11 Javascript
python shell根据ip获取主机名代码示例
2017/11/25 Python
分享8个非常流行的 Python 可视化工具包
2019/06/05 Python
详解程序意外中断自动重启shell脚本(以Python为例)
2019/07/26 Python
python之pymysql模块简单应用示例代码
2019/12/16 Python
pytorch中nn.Conv1d的用法详解
2019/12/31 Python
python读取配置文件方式(ini、yaml、xml)
2020/04/09 Python
高清屏中使用Canvas绘图出现模糊的问题及解决方法
2019/06/03 HTML / CSS
加拿大时尚潮流大码女装购物网站:Addition Elle
2018/04/02 全球购物
日语求职信范文
2013/12/17 职场文书
歌唱比赛策划方案
2014/06/06 职场文书
酒店仓管员岗位职责
2015/04/01 职场文书
《司马光》教学反思
2016/02/22 职场文书
django学习之ajax post传参的2种格式实例
2021/05/14 Python
解决Jenkins集成SonarQube遇到的报错问题
2021/07/15 Java/Android
MySQL 聚合函数排序
2021/07/16 MySQL