Python对Protobuf进行序列化与反序列化

Python Protobuf

  • 1.了解Protobuf:
    • 1.1 Protobuf语法介绍:
  • 2. Python使用Protobuf:(windows平台上)

1.了解Protobuf:

我们在使用protobuf之前首先要了解protobuf,那么什么是protobuf呢?

官方的解释是:

protocol buffers 是一种与语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。

Protocol Buffers 是一种灵活,高效,自动化机制的结构数据序列化方法-可类比 XML,但是比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单。

你可以定义数据的结构,然后使用特殊生成的源代码轻松的在各种数据流中使用各种语言进行编写和读取结构数据。你甚至可以更新数据结构,而不破坏由旧数据结构编译的已部署程序。

简单的来说,ProtoBufjsonxml一样是一种结构化的数据格式,用于数据通信的传输及数据的存储。但ProtoBuf相比jsonxml来说具有以下的优点:

  • 性能好,效率高:是一种二进制的数据格式,比xml小3-5倍,其速度是xml的20-100倍。
  • 代码生成机制,数据解析类自动生成:提供了根据proto文件生成对应的源文件代码生成机制。windows(proto.exe)、linux平台动态编译生成
  • 支持向后和向前兼容:兼容以前和以后的其他版本,更新数据结构,不影响破坏原有的旧程序。
  • 支持多种编译语言:提供了C++、python、java多种语言的支持。

缺点:

  • 其内部格式是二进制,导致数据可读性差。

1.1 Protobuf语法介绍:

在Protobuf中,.proto文件相当于确定数据协议,数据结构中存在哪些数据,数据类型是怎么样的。先来看一个简单的.proto文件的数据结构,然后再来详细了解一下protobuf语法

syntax = "proto3";message SearchRequest {string query = 1;int32 page_number = 2;int32 result_per_page = 3;
}
  • 该文件的第一行指定您正在使用proto3语法:如果您不这样做,protobuf 编译器将假定您正在使用proto2。这必须是文件的第一个非空的非注释行。
  • 所述SearchRequest消息定义了三个字段(名称/值对),每个字段都有一个名称和类型,及唯一的数字标识符。

protobuf2中.proto文件中的数据结构由以下几部分组成:

  • 关键字message:代表实体结构,由多个消息字段(field)组成。
  • 消息字段: 由数据类型、字段名、字段规则、字段唯一标识、默认值组成。
  • 数据类型:
    • 复合型数据类型:枚举、message类型
    • 标准数据类型:整型、浮点、字符串等
  • 字段规则
    • required:必须初始化字段,如果没有赋值,在数据序列化时会抛出异常
    • optional:可选字段,可以不赋值。如果没有赋值,会使用默认值
    • repeated:表示该字段可以重复任意次数,包括0次。重复数据的顺序将会保存在protocol buffer中。
  • 字段唯一标识:每个字段都有唯一的数字标识符。用于标记该字段在序列化后的二进制数据中输在的field,每个字段的唯一数字标识符在message内部都是独一无二的。
  • 默认值:在定义消息字段时可以给出默认值

Potobuf3与Protobuf2不同的地方:

1、字段规则:

  • 字段前取消了required和optional两个关键字,目前只保留了repeated关键字。
  • 修饰消息的字段修饰符必须是singular、或repeated。
    • singular:一个格式良好的消息应该有0个或者1个这种字段(但是不能超过1个)。
    • repeated:在一个格式良好的消息中,这种字段可以重复任意多次(包括0次)。重复的值的顺序会被保留。

2、取消了设置默认值:

  • string默认为字符串
  • bytes默认为空bytes
  • bool默认为false
  • 数字类型默认为0
  • 枚举类型默认为第一个枚举定义的第一个值。且第一个值必须为0。

3、支持的数据类型有:

double、float、int32、int64、uint32、uint64、sint32、sint64、fixed32、fixed64、sfixed32、sfixed64、bool、string、bytes

4、分配标识符:

正如上述文件格式,在消息定义中,每个字段都有唯一的一个数字标识符。这些标识符是用来在消息的二进制格式中识别各个字段的,一旦开始使用就不能够再改变。

注意:[1,15]之内的标识号在编码的时候会占用一个字节。[16,2047]之内的标识号则占用2个字节。所以应该为那些频繁出现的消息元素保留 [1,15]之内的标识号。切记:要为将来有可能添加的、频繁出现的标识号预留一些标识号。

最小的标识号可以从1开始,最大到2^29 - 1, or 536,870,911。不可以使用其中的[19000-19999]的标识号, Protobuf协议实现中对这些进行了预留。如果非要在.proto文件中使用这些预留标识号,编译时就会报错。


2. Python使用Protobuf:(windows平台上)

1. 首先下载平台对应的proto编译器,根据平台下载对应版本:

https://github.com/google/protobuf/releases
在这里插入图片描述
windows平台可以下win64。

然后将压缩包解压,将压缩包中bin目录下的proto.exe文件放到项目目录下,用于将来编译.proto文件。
在这里插入图片描述

在该目录下执行:protoc.exe --version判断是否可用
在这里插入图片描述
然后执行:pip install protobuf 安装protobuf模块

2. 在项目目录下创建test.proto文件,定义数据结构

syntax = "proto3";  // 指定protobuf语法版本
package Protobuf_test;  // 包名message AddressBook {repeated Person people = 1;
}message Person {string name = 1;int32 id = 2;string email = 3;float money = 4;bool work_status = 5;repeated PhoneNumber phones = 6;MyMessage maps = 7;}message PhoneNumber {string number = 1;PhoneType type = 2;
}enum PhoneType {MOBILE = 0;HOME = 1;WORK = 2;
}message MyMessage {map<int32, int32> mapfield = 1;
}

3. 使用proto.exe编译.proto文件,生成一个对应的.py的文件

在项目目录下执行:proto.exe --python_out = ./ test.proto
在这里插入图片描述

4. 接下来就可以编写python程序进行序列化和反序列化了

import test_pb2address_book = test_pb2.AddressBook()
person = address_book.people.add()person.id = 1
person.name = 'lichungang'
person.email = 'xxxxx@163.com'
person.money = 1
person.work_status = Truephone_number = person.phones.add()
phone_number.number = "123456"
phone_number.type = test_pb2.MOBILEmaps = person.maps  # maps类型是singular,不是repeated类型无法使用add()
maps.mapfield[1] = 1
maps.mapfield[2] = 2# 序列化
serialize_to_string = address_book.SerializeToString()
print(serialize_to_string, type(serialize_to_string))# 反序列化
address_book.ParseFromString(serialize_to_string)for person in address_book.people:print("p_id:{},p_name:{},p_email:{},p_money:{},p_workstatu:{}".format(person.id, person.name, person.email, person.money, person.work_status))for phone_number in person.phones:print(phone_number.number, phone_number.type)for key in person.maps.mapfield:print(key, person.maps.mapfield[key])

结果:

b'\n<\n\nlichungang\x10\x01\x1a\rxxxxx@163.com%\x00\x00\x80?(\x012\x08\n\x06123456:\x0c\n\x04\x08\x01\x10\x01\n\x04\x08\x02\x10\x02' <class 'bytes'>
p_id:1,p_name:lichungang,p_email:xxxxx@163.com,p_money:1.0,p_workstatu:True
123456 0
1 1
2 2

参考:
https://www.cnblogs.com/sanshengshui/p/9739521.html

https://blog.csdn.net/caisini_vc/article/details/5599468

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/400664.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sql server management studio 查询的临时文件路径

C:\Users\你的登录名称\Documents\SQL Server Management Studio\Backup FilesC:\Users\你的登录名称\AppData\Local\Temp\sql server management studio 非正常关闭时自动保存的路径在sql server management studio 里创建的“新建查询”且没有手动保存的路径转载于:https://w…

K210 / Openmv实现 大津法/Otsu最大类间方差法 自适应二值化

目录源码效果平台&#xff1a;K210 固件版本&#xff1a;maixpy_v0.6.2_54_g897214100_openmv_kmodel_v4_with_ide_support.bin OpenMv库自带Otsu算法: 源码 # Otsu.py - By: Royic - 周三 9月 22 2021import sensor, imagesensor.reset() sensor.set_pixformat(sensor.GRAY…

第一章:OpenCV入门

第一章&#xff1a;OpenCV入门 OpenCV是一个开源的计算机视觉库&#xff0c;1999年有英特尔的Gary Bradski启动。OpenCV库由C和C语言编写&#xff0c;涵盖计算机视觉各个领域内的500多个函数&#xff0c;可以在多个操作系统上运行。它旨在提供一个简洁而又高效的接口&#xff…

【机器视觉学习笔记】双边滤波算法(C++)

目录源码滤波器主函数效果完整源码平台&#xff1a;Windows 10 20H2 Visual Studio 2015 OpenCV 4.5.3 本文所用源码修改自双边滤波(bilateral filter)以及联合双边滤波&#xff08;joint bilateral filter&#xff09;—— flow_specter 源码 滤波器 // 双边滤波 // src…

第二章:图像处理基础

第二章&#xff1a;图像处理基础操作一、图像的基本表示方法&#xff1a;1. 二值图像&#xff1a;2. 灰度图像&#xff1a;3. 彩色图像&#xff1a;二、像素处理&#xff1a;1. 二值图像及灰度图像&#xff1a;2.彩色图像&#xff1a;3. 使用numpy.array访问像素&#xff1a;三…

《Head First设计模式》 读书笔记16 其余的模式(二) 蝇量 解释器 中介者

《Head First设计模式》 读书笔记16 其余的模式&#xff08;二&#xff09; 蝇量 解释器 中介者 蝇量&#xff08;Flyweight Pattern&#xff09; 如想让某个类的一个实例能用来提供许多“虚拟实例”&#xff0c;就使用蝇量模式&#xff08;Flyweight Pattern&#xff09; 。 例…

洛谷P1525 关押罪犯

P1525 关押罪犯 题目描述 S 城现有两座监狱&#xff0c;一共关押着N 名罪犯&#xff0c;编号分别为1~N。他们之间的关系自然也极不和谐。很多罪犯之间甚至积怨已久&#xff0c;如果客观条件具备则随时可能爆发冲突。我们用“怨气值”&#xff08;一个正整数值&#xff09;来表示…

【机器视觉学习笔记】Hough变换直线检测(C++)

目录源码效果平台&#xff1a;Windows 10 20H2 Visual Studio 2015 OpenCV 4.5.3 本文源码摘自OpenCV2马拉松第22圈——Hough变换直线检测原理与实现 源码 #include <opencv2\opencv.hpp> #include <iostream> #include <opencv2\imgproc\types_c.h> #in…

第3章:图像运算

第3章&#xff1a;图像运算one. 图像加法运算&#xff1a;1. 加号运算符"":2. cv2.add()函数&#xff1a;two. 图像加权和&#xff1a;three. 按位逻辑运算&#xff1a;1. 按位与运算&#xff1a;2. 按位或运算&#xff1a;3.按位非运算&#xff1a;4. 按位异或运算&…

JMS中的消息通信模型

1. MQ简介&#xff1a; 消息队列&#xff08;Message Queue&#xff0c;简称MQ&#xff09;,是应用程序与应用程序之间的一种通信方法。应用程序通过发送和检索出入列队的针对应用程序的数据 - 消息来通信&#xff0c;而无需专用连接来链接它们。程序之间通过在消息中发送数据进…

【机器视觉学习笔记】最近邻插值实现图片任意角度旋转(C++)

目录原理源码RotateImage主函数效果完整源码速度优化源码优化效果平台&#xff1a;Windows 10 20H2 Visual Studio 2015 OpenCV 4.5.3 本文算法改进自图形算法与实战&#xff1a;6.图像运动专题&#xff08;5&#xff09;图像旋转-基于近邻插值的图像旋转 —— 进击的CV 原理…

UGUI的优点新UI系统

UGUI的优点新UI系统 第1章 新UI系统概述 UGUI的优点新UI系统&#xff0c;新的UI系统相较于旧的UI系统而言&#xff0c;是一个巨大的飞跃&#xff01;有过旧UI系统使用体验的开发者&#xff0c;大部分都对它没有任何好感&#xff0c;以至于在过去的很长一段时间里&#xff0c;大…

【探索HTML5第二弹05】响应式布局(中),一步一步响应式布局

前言 前天初步探究了一次响应式布局&#xff0c;虽然花了一天功夫&#xff0c;做出来的东西还是不行&#xff0c;在此我还是认为要做响应式布局设计应该先行&#xff0c;应该先制作3个以上的设计图出来&#xff0c;但是对于手机来说&#xff0c;图片流量也是个问题&#xff0c;…

通过使用CSS字体阴影效果解决hover图片时显示文字看不清的问题

1.前言 最近需要加入一个小功能&#xff0c;在鼠标越过图片时&#xff0c;提示其大小和分辨率&#xff0c;而不想用增加属性title来提醒&#xff0c;不够好看。然而发现如果文字是一种颜色&#xff0c;然后总有概率碰到那张图上浮一层的文字会看不到&#xff0c;所以加入文字字…

第4章:色彩空间类型转换

第四章&#xff1a;色彩空间类型转换one. 色彩空间基础知识&#xff1a;1. GRAY色彩空间&#xff1a;2. XYZ色彩空间3. YCrCb色彩空间3. HSV色彩空间4. HLS 色彩空间5. CIEL * a * b *色彩空间6. CIEL * u * v *色彩空间7. Bayer色彩空间two. 类型转换函数&#xff1a;three. 类…

【机器视觉学习笔记】双线性插值实现图片任意角度旋转(C++)

目录原理源码RotateImage_BilinearInterpolation主函数效果与最近邻插值比较原图最近邻插值效果&#xff08;局部&#xff09;双线性插值效果&#xff08;局部&#xff09;完整源码平台&#xff1a;Windows 10 20H2 Visual Studio 2015 OpenCV 4.5.3 原理 如图所示&#xff0…

第5章 - 几何变换

第五章-几何变换one. 缩放:two. 翻转&#xff1a;three. 仿射&#xff1a;1. 平移&#xff1a;2. 旋转&#xff1a;3. 更多复杂的仿射变换&#xff1a;four. 透视&#xff1a;five. 重映射&#xff1a;1. 映射参数的理解&#xff1a;2. 复制&#xff1a;3. 绕x轴旋转&#xff1…

安装设置Android Studio Win7安装

发一下牢骚和主题无关&#xff1a; 让人等待已久的Google I/O 2013 大会没有给我们带来Android5.0&#xff0c;也没有带来Adnroid4.3等等&#xff0c;但带来了Android Studio&#xff0c;虽说是预览版&#xff0c;又是基于Intellij IDEA&#xff0c; 但是也无不让开辟者们高兴。…

【树莓派学习笔记】一、烧录系统、(无屏幕)配置Wifi和SSH服务

目录系统镜像的准备格式化TF卡烧录镜像配置Wifi开启SSH服务第一次开机平台&#xff1a;树莓派3B 版本&#xff1a; 2021-05-07-raspios-buster-armhf 系统镜像的准备 树莓派资源里有许多资源&#xff0c;包括我们要用到的镜像。 格式化TF卡 将TF卡格式化为FAT32格式。 …

第6章-阈值处理

第六章-阈值处理one. threshold函数&#xff1a;1. 二值化阈值处理&#xff08;cv2.THRESH_BINARY&#xff09;&#xff1a;2. 反二值化阈值处理(cv2.THRESH_BINARY_INV)3. 截断阈值化处理(cv2.THRESH_TRUNC)4. 超阈值零处理(cv2.THRESH_TOZERO_INV)5.低阈值零处理(cv2.THRESH_…