Protobuf协议初级详解(python使用)从安装到序列化-反序列化

这篇具有很好参考价值的文章主要介绍了Protobuf协议初级详解(python使用)从安装到序列化-反序列化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、前言

  • Protobuf是一种轻便高效的结构化数据存储格式,可以用于结构化数据序列化,很适合做数据存储或 RPC 数据交换格式。它可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。

  • 可以简单理解为,是一种跨语言、跨平台的数据传输格式。与json的功能类似,但是无论是性能,还是数据大小都比json要好很多。

  • protobuf的之所以可以跨语言,就是因为数据定义的格式为.proto格式,需要基于protoc编译为对应的语言。

二、效果

既然说到了性能,还是数据大小都比json要好很多。那么我们不如来用一个例子了解一下具体展现在哪里。这同一个数据经过Protobuf和Json格式转换后的数据大小。可以直观的看到Protobuf足足少了四分之三。
python protobuf库安装,python,开发语言,json,分布式

三、教程

1)安装

protobuf下载地址
我是windows所以就选择了windows的包
python protobuf库安装,python,开发语言,json,分布式
将protoc-23.1-win64.zip解压后打开该目录的bin目录,复制路径
python protobuf库安装,python,开发语言,json,分布式
打开电脑的环境变量设置,在系统变量下面选择Path变量编辑python protobuf库安装,python,开发语言,json,分布式
新建一个,然后将复制的路径粘贴到下面
python protobuf库安装,python,开发语言,json,分布式
在命令行敲一下下面命令查看是否可以正常调用

protoc --version

python protobuf库安装,python,开发语言,json,分布式
然后再解压protobuf-23.1.zip文件,找到python
python protobuf库安装,python,开发语言,json,分布式

)
python目录打开cmd将下面三条命令敲入(pip的protobuf和下载的protobuf版本最好一致)–要在当前目录下的cmd噢

pip install protobuf
python setup.py build
python setup.py install

python protobuf库安装,python,开发语言,json,分布式
cmd打开python可以正常输入下面命令就代表安装成功了。

from google.protobuf.internal import builder

python protobuf库安装,python,开发语言,json,分布式

2)使用

一个大概流程图
python protobuf库安装,python,开发语言,json,分布式

1.创建.proto文件

根据流程图,我们第一步是创建一个.proto文件
python protobuf库安装,python,开发语言,json,分布式

2.proto语法

既然知道这是一个语法文件,那么里面肯定是要写一些语法在里面的。
这些语法是相当于一个和使用者的约定,约定这些字段是这种语法定义的结构。(这里只是基础例子写的语法,具体的可以看文章gRPC之proto语法)

//第一行的含义是使用的是proto3的语法,如果没有这句,则默认使用proto2;
syntax = "proto3";
/*Person定义有三个承载消息的属性,每一个被定义在Person 消息体中的字段,都是由数据类型和属性名称组成。
里面的123是代表了编号,protobuf为了节省空间,使用了编号来代替字段名,只有服务器和客户端拥有同样的proto语法文件才可以知道正确的字段名
不然解析出来的也是123为代表的结果
 */
message Person {
    int32 id = 1;
    string name = 2;
    message Iphone {
        string number = 1;
    }
    //repeated: 这个属性代表了可以重复增加,就相当于往List数组增加数据
    repeated Iphone phones = 3;
}

message totalPerson{
    repeated Person person = 1;
}

3.protoc.exe文件编译.proto语法文件

在cmd输入下面命令,example.proto是你写的.proto语法文件。

protoc --python_out=. example.proto

python protobuf库安装,python,开发语言,json,分布式
然后会在同级目录下出现example_pb2.py文件
python protobuf库安装,python,开发语言,json,分布式

4.序列化

既然得到了example_pb2.py文件,那我们可以开始尝试序列化一份数据了。
先创建一份main.py文件,通过定义好的example_pb2.py文件语法来定义数据(实则是根据.proto文件来定义),然后进行一个序列化操作(使用SerializeToString)。

import example_pb2

# 从生成的example_pb2导入totalPerson(相当于初始化对象)
result_pro = example_pb2.totalPerson()
# 从语法文件可以看到totalPerson中有repeated就代表person是可以被add多个的,我们这里就新增一个就好了;
person_message = result_pro.person.add()
# person被初始化后,就可以定义里面的属性了
person_message.id = 1
person_message.name = "laowang"
# 基础属性定义完后,还有一个复合属性phones,这里对他进行一个新增初始化
phone = person_message.phones.add()
# 定义对象属性
phone.number="123456"

# 这里是将定义好的数据进行一个序列化操作
result=result_pro.SerializeToString()
print(result)
print("Protobuf: ", result.__sizeof__())

# 这里是将定义好的数据进行一个序列化操作并且存入到bin文件
with open("my_example.bin", "wb") as f:
	f.write(result)

python protobuf库安装,python,开发语言,json,分布式

5.反序列化

上图可以看到成功序列化数据出来了,我们现在则要对保存的bin文件进行反序列化

  • 先通过有proto语法文件的反序列化(使用ParseFromString)
import example_pb2

# 从生成的example_pb2导入totalPerson(相当于初始化对象)
result_pro = example_pb2.totalPerson()

with open("my_example.bin", "rb") as f:
	result_pro.ParseFromString(f.read())
	print(result_pro)

python protobuf库安装,python,开发语言,json,分布式
可以看到很好的还原出来了我们定义并且想要的数据格式。接下来我们看看json类似的数据格式与之对比
python protobuf库安装,python,开发语言,json,分布式

  • 无proto语法文件的反序列化
    如果没有语法文件呢,不用急,protobuf给了我们这样一个工具可以帮助我们除了键名基本还原出来。(在my_example.bin同级目录下打开cmd输入下面命令)
protoc --decode_raw < my_example.bin

可以得到下面的数据结构,对比上面除了键名不同其他都是一样的,这就是protobuf对于键名不是很敏感的原因,他更敏感我们上面注释说的编号。这里展现的就是我们之前给键名定义的编号。
所以如果想要复刻只需要自己重新写一个proto语法文件,对照着编号结构,重新起一个键名进行生成_pb2.py文件去达到序列化相同的数据结构。
python protobuf库安装,python,开发语言,json,分布式
新建一个myprotobuf.proto语法文件,把键名全部换了(图方便相当于根据上图的结果来模拟一个.proto语法结构)

syntax = "proto3";

message newPerson {
    int32 newid = 1;
    string newname = 2;
    message newIphone {
        string newnumber = 1;
    }
    repeated newIphone newphones = 3;
}

message newtotalPerson{
    repeated newPerson newperson = 1;
}

然后编译它生成myprotobuf_pb2.py

protoc --python_out=. myprotobuf.proto

修改main.py文件调用,这里还是读取我们上次序列化数据的bin文件

import myprotobuf_pb2

# 从生成的example_pb2导入totalPerson(相当于初始化对象)
result_pro = myprotobuf_pb2.newtotalPerson()
# 反序列化
with open("my_example.bin", "rb") as f:
    result_pro.ParseFromString(f.read())
    print(result_pro)

可以看到成功反序列化出来了数据
python protobuf库安装,python,开发语言,json,分布式

四、借鉴

什么是protobuf
gRPC之proto语法
JS逆向-Protobuf逆向解析文章来源地址https://www.toymoban.com/news/detail-763121.html

到了这里,关于Protobuf协议初级详解(python使用)从安装到序列化-反序列化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用脚本收发 protobuf 协议数据

    最近做了一个 ipv6 相关的功能,发现使用 getifaddrs 获取的本地 ipv6 地址有可能不是真实的网络 ipv6 地址: 例如上图中通过 getifaddrs 获得了多个本地 ipv6 地址,其中 fe80 开头的已知是本地 ipv6 地址,被排除;还有 2408 这种,其实也是 \\\"假 ipv6\\\" 地址,对应的设备并不能访问 ipv6

    2024年02月08日
    浏览(41)
  • rpc、gRPC快速入门,python调用,protobuf协议

    远程过程调用协议RPC (Remote Procedure Call Protocol) RPC是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据 举例:在 a服务内

    2024年02月13日
    浏览(55)
  • 数据序列化工具Protobuf编码&避坑指南

    先简单介绍一下 Protocol Buffers(protobuf),它是 Google 开发的一种数据序列化协议(与 XML、JSON 类似)。它具有很多优点,但也有一些需要注意的缺点: 优点: 效率高 :Protobuf 以二进制格式存储数据,比如 XML 和 JSON 等文本格式更紧凑,也更快。序列化和反序列化的速度也很

    2024年02月13日
    浏览(43)
  • 网络数据通信—ProtoBuf实现序列化和反序列化

    目录 前言 1.环境搭建 2. centos下编写的注意事项 3.约定双端交互接口 4.约定双端交互req/resp 5. 客户端代码实现 6.服务端代码实现 Protobuf还常用于通讯协议、服务端数据交换场景。那么在这个示例中,我们将实现一个网络版本的通讯录,模拟实现客户端与服务端的交互,通过P

    2024年02月04日
    浏览(43)
  • SOME/IP协议详解[7 SOME/IP序列化]

    什么是序列化与反序列化? 序列化是指将数据结构或对象按定义的规则转换成二进制串的过程。 反序列化是指将二进制串依据相同规则重新构建成数据结构或对象的过程。 而本质就是一种编码规范。 在SOME/IP中使用序列化的目的和作用? 使数据按照固定格式进行编排成为字

    2024年02月15日
    浏览(35)
  • Unity基于Google Protobuf序列化和反序列化小案例

    1.协议定义,简单实现传玩家的2D坐标    2.在Unity的Assets目录下创建一个Plugins文件夹(必须这样命名),此文件专门存放扩展文件, 再新建文件夹BaseInfolibrary,将Google.Protobuf.dll拖入  3.新建一个Test.cs脚本  脚本中引入命名空间 代码改进:通用序列化模板(只用来序列化Message)

    2024年02月15日
    浏览(34)
  • Protobuf-net:C#高效序列化工具,助力接口传输与前端解析

      概述: Protobuf-net是C#中高效的二进制序列化工具,以紧凑、跨语言支持和卓越性能著称。通过定义消息类型、序列化和反序列化实现数据传输,并可适用于Web接口。前端可使用protobuf.js库解析Protobuf格式数据。 Protobuf-net(Protocol Buffers)是一种高效的二进制序列化工具,具有

    2024年03月09日
    浏览(40)
  • 【软考网络管理员】2023年软考网管初级常见知识考点(13)-ARP、ICMP、IPv6协议详解

    #涉及知识点 ARP协议详解、ICMP协议详解、IPv6协议等软考内容详解 软考网络管理员常考知识点,软考网络管理员网络安全,网络管理员考点汇总。 原创于:CSDN博主-《拄杖盲学轻声码》,更多考点汇总可以去他主页查看 更多考试总结可关注CSDN博主-《拄杖盲学轻声码》 在网络

    2024年02月11日
    浏览(50)
  • [Linux] 初识应用层协议: 序列化与反序列化、编码与解码、jsoncpp简单使用...

    有关Linux网络, 之前的文章已经简单演示介绍了 UDP 、 TCP 套接字编程 相关文章: [Linux] 网络编程 - 初见UDP套接字编程: 网络编程部分相关概念、TCP、UDP协议基本特点、网络字节序、socket接口使用、简单的UDP网络及聊天室实现… [Linux] 网络编程 - 初见TCP套接字编程: 实现简单的单

    2024年02月15日
    浏览(73)
  • [golang 微服务] 3. ProtoBuf认识,安装以及golang 中ProtoBuf使用

    在移动互联网时代, 手机流量 、 电量 是最为有限的资源,而移动端的即时通讯应用无疑必须得直面这两点。解决流量过大的基本方法就是 使用高度压缩的 通信协议 ,而数据压缩后流量减小带来的自然结果也就是省电:因为大数据量的传输必然需要 更久的网络操作 、 数据

    2024年02月10日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包