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下载Bing图片(代码)
Nov 07 Python
python根据出生年份简单计算生肖的方法
Mar 27 Python
python引用DLL文件的方法
May 11 Python
Python实现简单的多任务mysql转xml的方法
Feb 08 Python
Python学习笔记之if语句的使用示例
Oct 23 Python
Python3.5.3下配置opencv3.2.0的操作方法
Apr 02 Python
python 使用pdfminer3k 读取PDF文档的例子
Aug 27 Python
wxPython实现分隔窗口
Nov 19 Python
Python字符串的修改方法实例
Dec 19 Python
pytorch三层全连接层实现手写字母识别方式
Jan 14 Python
keras 特征图可视化实例(中间层)
Jan 24 Python
Python使用requests模块爬取百度翻译
Aug 25 Python
详解分布式系统中如何用python实现Paxos
May 18 #Python
如何在向量化NumPy数组上进行移动窗口
Python如何配置环境变量详解
Python打包为exe详细教程
Python基础之数据类型知识汇总
May 18 #Python
Python实战之疫苗研发情况可视化
Python打包exe时各种异常处理方案总结
You might like
PHP面向对象学习笔记之二 生成对象的设计模式
2012/10/06 PHP
解析:使用php mongodb扩展时 需要注意的事项
2013/06/18 PHP
PHP中time(),date(),mktime()区别介绍
2013/09/28 PHP
浅析ThinkPHP中的pathinfo模式和URL重写
2014/01/06 PHP
ThinkPHP之N方法实例详解
2014/06/20 PHP
ThinkPHP中I(),U(),$this->post()等函数用法
2014/11/22 PHP
详解php与ethereum客户端交互
2018/04/28 PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
2020/04/04 PHP
根据分辩率调用不同的CSS.
2007/01/08 Javascript
Grid得到选择行数据的方法总结
2011/01/17 Javascript
图片上传判断及预览脚本的效果实例
2013/08/07 Javascript
元素未显示设置width/height时IE中使用currentStyle获取为auto
2014/05/04 Javascript
浅谈Sticky组件的改进实现
2016/03/22 Javascript
详解js产生对象的3种基本方式(工厂模式,构造函数模式,原型模式)
2017/01/09 Javascript
基于JS实现一个随机生成验证码功能
2019/05/29 Javascript
JavaScript实现五子棋游戏的方法详解
2019/07/08 Javascript
vue 表单输入框不支持focus及blur事件的解决方案
2020/11/17 Vue.js
python使用mysqldb连接数据库操作方法示例详解
2013/12/03 Python
python 判断网络连通的实现方法
2018/04/22 Python
Python利用正则表达式实现计算器算法思路解析
2018/04/25 Python
学习和使用python的13个理由
2019/07/30 Python
python中matplotlib实现随鼠标滑动自动标注代码
2020/04/23 Python
Python tkinter实现简单加法计算器代码实例
2020/05/13 Python
详解如何在css中引入自定义字体(font-face)
2018/05/17 HTML / CSS
阿迪达斯法国官方网站:adidas法国
2018/03/20 全球购物
美国在线自行车商店:Jenson USA
2018/05/22 全球购物
解除劳动合同协议书
2014/04/14 职场文书
学生安全承诺书
2014/05/22 职场文书
2014年个人债务授权委托书范本
2014/09/22 职场文书
2014年双拥工作总结
2014/11/21 职场文书
债务追讨律师函
2015/06/24 职场文书
学习雷锋主题班会
2015/08/14 职场文书
五一放假通知怎么写
2015/08/18 职场文书
《我是什么》教学反思
2016/02/16 职场文书
使用css样式设计一个简单的html登陆界面的实现
2021/03/30 HTML / CSS
nginx七层负载均衡配置详解
2022/07/15 Servers