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远程登录代码
Apr 29 Python
python创建列表并给列表赋初始值的方法
Jul 28 Python
python django 访问静态文件出现404或500错误
Jan 20 Python
Pyqt实现无边框窗口拖动以及窗口大小改变
Apr 19 Python
深入flask之异步非堵塞实现代码示例
Jul 31 Python
在Python 不同级目录之间模块的调用方法
Jan 19 Python
详解如何设置Python环境变量?
May 13 Python
PyTorch中Tensor的拼接与拆分的实现
Aug 18 Python
Python Django 封装分页成通用的模块详解
Aug 21 Python
IronPython连接MySQL的方法步骤
Dec 27 Python
Django通过json格式收集主机信息
May 29 Python
python爬虫工具例举说明
Nov 30 Python
详解分布式系统中如何用python实现Paxos
May 18 #Python
如何在向量化NumPy数组上进行移动窗口
Python如何配置环境变量详解
Python打包为exe详细教程
Python基础之数据类型知识汇总
May 18 #Python
Python实战之疫苗研发情况可视化
Python打包exe时各种异常处理方案总结
You might like
PHP修改session_id示例代码
2014/01/08 PHP
php使用fputcsv()函数csv文件读写数据的方法
2015/01/06 PHP
Ubuntu 16.04下安装PHP 7过程详解
2017/03/28 PHP
php + nginx项目中的权限详解
2017/05/23 PHP
PHP策略模式定义与用法示例
2017/07/27 PHP
详细解读php的命名空间(二)
2018/02/21 PHP
php并发加锁问题分析与设计代码实例讲解
2021/02/26 PHP
HTML页面如何象ASP一样接受参数
2007/02/07 Javascript
IE浏览器不支持getElementsByClassName的解决方法
2014/08/27 Javascript
修改或扩展jQuery原生方法的代码实例
2015/01/13 Javascript
BootStrap使用popover插件实现鼠标经过显示并保持显示框
2016/06/23 Javascript
AngularJS实现单独作用域内的数据操作
2016/09/05 Javascript
MVVM 双向绑定的实现代码
2018/06/21 Javascript
Vue Router去掉url中默认的锚点#
2018/08/01 Javascript
Vue表单控件绑定图文详解
2019/02/11 Javascript
详解element-ui设置下拉选择切换必填和非必填
2019/06/17 Javascript
Vue Render函数创建DOM节点代码实例
2020/07/08 Javascript
[57:12]完美世界DOTA2联赛循环赛 Inki vs Matador BO2第一场 10.31
2020/11/02 DOTA
python正则表达式抓取成语网站
2013/11/20 Python
通过实例浅析Python对比C语言的编程思想差异
2015/08/30 Python
Python 使用类写装饰器的小技巧
2018/09/30 Python
Django添加KindEditor富文本编辑器的使用
2018/10/24 Python
基于Tensorflow:CPU性能分析
2020/02/10 Python
Restful_framework视图组件代码实例解析
2020/11/17 Python
美国新蛋IT数码商城:Newegg.com
2016/07/21 全球购物
猫途鹰:全球领先的旅游点评社区
2017/04/07 全球购物
学校法制宣传月活动总结
2014/07/03 职场文书
2014年仓库工作总结
2014/11/20 职场文书
2015年语文教研组工作总结
2015/05/23 职场文书
我的法兰西岁月观后感
2015/06/09 职场文书
运动会通讯稿50字
2015/07/20 职场文书
解除租赁合同协议书
2016/03/21 职场文书
15个值得收藏的JavaScript函数
2021/09/15 Javascript
解决IDEA翻译插件Translation报错更新TTK失败不能使用
2022/04/24 Python
tomcat下部署jenkins的方法
2022/05/06 Servers
Li list-style-image 图片垂直居中实现方法
2023/05/21 HTML / CSS