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中endswith()函数的基本使用
Apr 07 Python
python开发之IDEL(Python GUI)的使用方法图文详解
Nov 12 Python
Python中利用Scipy包的SIFT方法进行图片识别的实例教程
Jun 03 Python
Python Paramiko模块的安装与使用详解
Nov 18 Python
如何使用Python 打印各种三角形
Jun 28 Python
python实现的多任务版udp聊天器功能案例
Nov 13 Python
CentOS7下安装python3.6.8的教程详解
Jan 03 Python
Python cookie的保存与读取、SSL讲解
Feb 17 Python
python爬虫容易学吗
Jun 02 Python
python 字符串的驻留机制及优缺点
Jun 19 Python
Python Socket编程详解
Apr 25 Python
Python游戏开发实例之graphics实现AI五子棋
Nov 01 Python
详解分布式系统中如何用python实现Paxos
May 18 #Python
如何在向量化NumPy数组上进行移动窗口
Python如何配置环境变量详解
Python打包为exe详细教程
Python基础之数据类型知识汇总
May 18 #Python
Python实战之疫苗研发情况可视化
Python打包exe时各种异常处理方案总结
You might like
php读取csv文件并输出的方法
2015/03/14 PHP
PHP中empty和isset对于参数结构的判断及empty()和isset()的区别
2015/11/15 PHP
php创建桌面快捷方式实现方法
2015/12/31 PHP
PHP从二维数组得到N层分类树的实现代码
2016/10/11 PHP
jquery 实现checkbox全选,反选,全不选等功能代码(奇数)
2012/10/24 Javascript
一些常用弹出窗口/拖放/异步文件上传等实用代码
2013/01/06 Javascript
js处理表格对table进行修饰
2014/05/26 Javascript
javascript将DOM节点添加到文档的方法实例分析
2015/08/04 Javascript
jQuery实现下拉框选择图片功能实例
2015/08/08 Javascript
jQuery插件开发精品教程(让你的jQuery更上一个台阶)
2015/11/07 Javascript
nodejs和php实现图片访问实时处理
2017/01/05 NodeJs
超全面的vue.js使用总结
2017/02/12 Javascript
使用原生的javascript来实现轮播图
2017/02/24 Javascript
js时间查询插件使用详解
2017/04/07 Javascript
vue解决一个方法同时发送多个请求的问题
2018/09/25 Javascript
layui实现把数据表格时间戳转换为时间格式的例子
2019/09/12 Javascript
JavaScript Canvas编写炫彩的网页时钟
2019/10/16 Javascript
Node.js fs模块原理及常见用途
2020/10/22 Javascript
NodeJS配置CORS实现过程详解
2020/12/02 NodeJs
解决Vue-cli3没有vue.config.js文件夹及配置vue项目域名的问题
2020/12/04 Vue.js
[15:56]Heroes18_暗影萨满(完美)
2014/10/31 DOTA
[02:55]2018DOTA2国际邀请赛勇士令状不朽珍藏Ⅲ饰品一览
2018/08/01 DOTA
使用python分析git log日志示例
2014/02/27 Python
Python 获取新浪微博的最新公共微博实例分享
2014/07/03 Python
解决pycharm无法识别本地site-packages的问题
2018/10/13 Python
解决Pycharm后台indexing导致不能run的问题
2019/06/27 Python
python装饰器相当于函数的调用方式
2019/12/27 Python
大四自我鉴定
2014/02/08 职场文书
股权收购意向书
2014/04/01 职场文书
学校安全教育月活动总结
2014/07/07 职场文书
2014年销售工作总结与计划
2014/12/01 职场文书
2015初中团支部工作总结
2015/07/21 职场文书
大学新生入学感想
2015/08/07 职场文书
《小摄影师》教学反思
2016/02/18 职场文书
教师实习自我鉴定总结
2019/08/20 职场文书
Vue如何实现组件间通信
2021/05/15 Vue.js