国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Protobuf協(xié)議初級(jí)詳解(python使用)從安裝到序列化-反序列化

這篇具有很好參考價(jià)值的文章主要介紹了Protobuf協(xié)議初級(jí)詳解(python使用)從安裝到序列化-反序列化。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一、前言

  • Protobuf是一種輕便高效的結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)格式,可以用于結(jié)構(gòu)化數(shù)據(jù)序列化,很適合做數(shù)據(jù)存儲(chǔ)或 RPC 數(shù)據(jù)交換格式。它可用于通訊協(xié)議、數(shù)據(jù)存儲(chǔ)等領(lǐng)域的語(yǔ)言無(wú)關(guān)、平臺(tái)無(wú)關(guān)、可擴(kuò)展的序列化結(jié)構(gòu)數(shù)據(jù)格式。

  • 可以簡(jiǎn)單理解為,是一種跨語(yǔ)言、跨平臺(tái)的數(shù)據(jù)傳輸格式。與json的功能類(lèi)似,但是無(wú)論是性能,還是數(shù)據(jù)大小都比json要好很多。

  • protobuf的之所以可以跨語(yǔ)言,就是因?yàn)閿?shù)據(jù)定義的格式為.proto格式,需要基于protoc編譯為對(duì)應(yīng)的語(yǔ)言。

二、效果

既然說(shuō)到了性能,還是數(shù)據(jù)大小都比json要好很多。那么我們不如來(lái)用一個(gè)例子了解一下具體展現(xiàn)在哪里。這同一個(gè)數(shù)據(jù)經(jīng)過(guò)Protobuf和Json格式轉(zhuǎn)換后的數(shù)據(jù)大小??梢灾庇^的看到Protobuf足足少了四分之三。
python protobuf庫(kù)安裝,python,開(kāi)發(fā)語(yǔ)言,json,分布式

三、教程

1)安裝

protobuf下載地址
我是windows所以就選擇了windows的包
python protobuf庫(kù)安裝,python,開(kāi)發(fā)語(yǔ)言,json,分布式
將protoc-23.1-win64.zip解壓后打開(kāi)該目錄的bin目錄,復(fù)制路徑
python protobuf庫(kù)安裝,python,開(kāi)發(fā)語(yǔ)言,json,分布式
打開(kāi)電腦的環(huán)境變量設(shè)置,在系統(tǒng)變量下面選擇Path變量編輯python protobuf庫(kù)安裝,python,開(kāi)發(fā)語(yǔ)言,json,分布式
新建一個(gè),然后將復(fù)制的路徑粘貼到下面
python protobuf庫(kù)安裝,python,開(kāi)發(fā)語(yǔ)言,json,分布式
在命令行敲一下下面命令查看是否可以正常調(diào)用

protoc --version

python protobuf庫(kù)安裝,python,開(kāi)發(fā)語(yǔ)言,json,分布式
然后再解壓protobuf-23.1.zip文件,找到python
python protobuf庫(kù)安裝,python,開(kāi)發(fā)語(yǔ)言,json,分布式

)
python目錄打開(kāi)cmd將下面三條命令敲入(pip的protobuf和下載的protobuf版本最好一致)–要在當(dāng)前目錄下的cmd噢

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

python protobuf庫(kù)安裝,python,開(kāi)發(fā)語(yǔ)言,json,分布式
cmd打開(kāi)python可以正常輸入下面命令就代表安裝成功了。

from google.protobuf.internal import builder

python protobuf庫(kù)安裝,python,開(kāi)發(fā)語(yǔ)言,json,分布式

2)使用

一個(gè)大概流程圖
python protobuf庫(kù)安裝,python,開(kāi)發(fā)語(yǔ)言,json,分布式

1.創(chuàng)建.proto文件

根據(jù)流程圖,我們第一步是創(chuàng)建一個(gè).proto文件
python protobuf庫(kù)安裝,python,開(kāi)發(fā)語(yǔ)言,json,分布式

2.proto語(yǔ)法

既然知道這是一個(gè)語(yǔ)法文件,那么里面肯定是要寫(xiě)一些語(yǔ)法在里面的。
這些語(yǔ)法是相當(dāng)于一個(gè)和使用者的約定,約定這些字段是這種語(yǔ)法定義的結(jié)構(gòu)。(這里只是基礎(chǔ)例子寫(xiě)的語(yǔ)法,具體的可以看文章gRPC之proto語(yǔ)法)

//第一行的含義是使用的是proto3的語(yǔ)法,如果沒(méi)有這句,則默認(rèn)使用proto2;
syntax = "proto3";
/*Person定義有三個(gè)承載消息的屬性,每一個(gè)被定義在Person 消息體中的字段,都是由數(shù)據(jù)類(lèi)型和屬性名稱組成。
里面的1,2,3是代表了編號(hào),protobuf為了節(jié)省空間,使用了編號(hào)來(lái)代替字段名,只有服務(wù)器和客戶端擁有同樣的proto語(yǔ)法文件才可以知道正確的字段名
不然解析出來(lái)的也是1,2,3為代表的結(jié)果
 */
message Person {
    int32 id = 1;
    string name = 2;
    message Iphone {
        string number = 1;
    }
    //repeated: 這個(gè)屬性代表了可以重復(fù)增加,就相當(dāng)于往List數(shù)組增加數(shù)據(jù)
    repeated Iphone phones = 3;
}

message totalPerson{
    repeated Person person = 1;
}

3.protoc.exe文件編譯.proto語(yǔ)法文件

在cmd輸入下面命令,example.proto是你寫(xiě)的.proto語(yǔ)法文件。

protoc --python_out=. example.proto

python protobuf庫(kù)安裝,python,開(kāi)發(fā)語(yǔ)言,json,分布式
然后會(huì)在同級(jí)目錄下出現(xiàn)example_pb2.py文件
python protobuf庫(kù)安裝,python,開(kāi)發(fā)語(yǔ)言,json,分布式

4.序列化

既然得到了example_pb2.py文件,那我們可以開(kāi)始嘗試序列化一份數(shù)據(jù)了。
先創(chuàng)建一份main.py文件,通過(guò)定義好的example_pb2.py文件語(yǔ)法來(lái)定義數(shù)據(jù)(實(shí)則是根據(jù).proto文件來(lái)定義),然后進(jìn)行一個(gè)序列化操作(使用SerializeToString)。

import example_pb2

# 從生成的example_pb2導(dǎo)入totalPerson(相當(dāng)于初始化對(duì)象)
result_pro = example_pb2.totalPerson()
# 從語(yǔ)法文件可以看到totalPerson中有repeated就代表person是可以被add多個(gè)的,我們這里就新增一個(gè)就好了;
person_message = result_pro.person.add()
# person被初始化后,就可以定義里面的屬性了
person_message.id = 1
person_message.name = "laowang"
# 基礎(chǔ)屬性定義完后,還有一個(gè)復(fù)合屬性phones,這里對(duì)他進(jìn)行一個(gè)新增初始化
phone = person_message.phones.add()
# 定義對(duì)象屬性
phone.number="123456"

# 這里是將定義好的數(shù)據(jù)進(jìn)行一個(gè)序列化操作
result=result_pro.SerializeToString()
print(result)
print("Protobuf: ", result.__sizeof__())

# 這里是將定義好的數(shù)據(jù)進(jìn)行一個(gè)序列化操作并且存入到bin文件
with open("my_example.bin", "wb") as f:
	f.write(result)

python protobuf庫(kù)安裝,python,開(kāi)發(fā)語(yǔ)言,json,分布式

5.反序列化

上圖可以看到成功序列化數(shù)據(jù)出來(lái)了,我們現(xiàn)在則要對(duì)保存的bin文件進(jìn)行反序列化

  • 先通過(guò)有proto語(yǔ)法文件的反序列化(使用ParseFromString)
import example_pb2

# 從生成的example_pb2導(dǎo)入totalPerson(相當(dāng)于初始化對(duì)象)
result_pro = example_pb2.totalPerson()

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

python protobuf庫(kù)安裝,python,開(kāi)發(fā)語(yǔ)言,json,分布式
可以看到很好的還原出來(lái)了我們定義并且想要的數(shù)據(jù)格式。接下來(lái)我們看看json類(lèi)似的數(shù)據(jù)格式與之對(duì)比
python protobuf庫(kù)安裝,python,開(kāi)發(fā)語(yǔ)言,json,分布式

  • 無(wú)proto語(yǔ)法文件的反序列化
    如果沒(méi)有語(yǔ)法文件呢,不用急,protobuf給了我們這樣一個(gè)工具可以幫助我們除了鍵名基本還原出來(lái)。(在my_example.bin同級(jí)目錄下打開(kāi)cmd輸入下面命令)
protoc --decode_raw < my_example.bin

可以得到下面的數(shù)據(jù)結(jié)構(gòu),對(duì)比上面除了鍵名不同其他都是一樣的,這就是protobuf對(duì)于鍵名不是很敏感的原因,他更敏感我們上面注釋說(shuō)的編號(hào)。這里展現(xiàn)的就是我們之前給鍵名定義的編號(hào)。
所以如果想要復(fù)刻只需要自己重新寫(xiě)一個(gè)proto語(yǔ)法文件,對(duì)照著編號(hào)結(jié)構(gòu),重新起一個(gè)鍵名進(jìn)行生成_pb2.py文件去達(dá)到序列化相同的數(shù)據(jù)結(jié)構(gòu)。
python protobuf庫(kù)安裝,python,開(kāi)發(fā)語(yǔ)言,json,分布式
新建一個(gè)myprotobuf.proto語(yǔ)法文件,把鍵名全部換了(圖方便相當(dāng)于根據(jù)上圖的結(jié)果來(lái)模擬一個(gè).proto語(yǔ)法結(jié)構(gòu))

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文件調(diào)用,這里還是讀取我們上次序列化數(shù)據(jù)的bin文件

import myprotobuf_pb2

# 從生成的example_pb2導(dǎo)入totalPerson(相當(dāng)于初始化對(duì)象)
result_pro = myprotobuf_pb2.newtotalPerson()
# 反序列化
with open("my_example.bin", "rb") as f:
    result_pro.ParseFromString(f.read())
    print(result_pro)

可以看到成功反序列化出來(lái)了數(shù)據(jù)
python protobuf庫(kù)安裝,python,開(kāi)發(fā)語(yǔ)言,json,分布式

四、借鑒

什么是protobuf
gRPC之proto語(yǔ)法
JS逆向-Protobuf逆向解析文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-763121.html

到了這里,關(guān)于Protobuf協(xié)議初級(jí)詳解(python使用)從安裝到序列化-反序列化的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 使用腳本收發(fā) protobuf 協(xié)議數(shù)據(jù)

    使用腳本收發(fā) protobuf 協(xié)議數(shù)據(jù)

    最近做了一個(gè) ipv6 相關(guān)的功能,發(fā)現(xiàn)使用 getifaddrs 獲取的本地 ipv6 地址有可能不是真實(shí)的網(wǎng)絡(luò) ipv6 地址: 例如上圖中通過(guò) getifaddrs 獲得了多個(gè)本地 ipv6 地址,其中 fe80 開(kāi)頭的已知是本地 ipv6 地址,被排除;還有 2408 這種,其實(shí)也是 \\\"假 ipv6\\\" 地址,對(duì)應(yīng)的設(shè)備并不能訪問(wèn) ipv6

    2024年02月08日
    瀏覽(18)
  • rpc、gRPC快速入門(mén),python調(diào)用,protobuf協(xié)議

    rpc、gRPC快速入門(mén),python調(diào)用,protobuf協(xié)議

    遠(yuǎn)程過(guò)程調(diào)用協(xié)議RPC (Remote Procedure Call Protocol) RPC是指遠(yuǎn)程過(guò)程調(diào)用,也就是說(shuō)兩臺(tái)服務(wù)器A,B,一個(gè)應(yīng)用部署在A服務(wù)器上,想要調(diào)用B服務(wù)器上應(yīng)用提供的函數(shù)/方法,由于不在一個(gè)內(nèi)存空間,不能直接調(diào)用,需要通過(guò)網(wǎng)絡(luò)來(lái)表達(dá)調(diào)用的語(yǔ)義和傳達(dá)調(diào)用的數(shù)據(jù) 舉例:在 a服務(wù)內(nèi)

    2024年02月13日
    瀏覽(23)
  • 數(shù)據(jù)序列化工具Protobuf編碼&避坑指南

    數(shù)據(jù)序列化工具Protobuf編碼&避坑指南

    先簡(jiǎn)單介紹一下 Protocol Buffers(protobuf),它是 Google 開(kāi)發(fā)的一種數(shù)據(jù)序列化協(xié)議(與 XML、JSON 類(lèi)似)。它具有很多優(yōu)點(diǎn),但也有一些需要注意的缺點(diǎn): 優(yōu)點(diǎn): 效率高 :Protobuf 以二進(jìn)制格式存儲(chǔ)數(shù)據(jù),比如 XML 和 JSON 等文本格式更緊湊,也更快。序列化和反序列化的速度也很

    2024年02月13日
    瀏覽(23)
  • 網(wǎng)絡(luò)數(shù)據(jù)通信—ProtoBuf實(shí)現(xiàn)序列化和反序列化

    目錄 前言 1.環(huán)境搭建 2. centos下編寫(xiě)的注意事項(xiàng) 3.約定雙端交互接口 4.約定雙端交互req/resp 5. 客戶端代碼實(shí)現(xiàn) 6.服務(wù)端代碼實(shí)現(xiàn) Protobuf還常用于通訊協(xié)議、服務(wù)端數(shù)據(jù)交換場(chǎng)景。那么在這個(gè)示例中,我們將實(shí)現(xiàn)一個(gè)網(wǎng)絡(luò)版本的通訊錄,模擬實(shí)現(xiàn)客戶端與服務(wù)端的交互,通過(guò)P

    2024年02月04日
    瀏覽(18)
  • SOME/IP協(xié)議詳解[7 SOME/IP序列化]

    SOME/IP協(xié)議詳解[7 SOME/IP序列化]

    什么是序列化與反序列化? 序列化是指將數(shù)據(jù)結(jié)構(gòu)或?qū)ο蟀炊x的規(guī)則轉(zhuǎn)換成二進(jìn)制串的過(guò)程。 反序列化是指將二進(jìn)制串依據(jù)相同規(guī)則重新構(gòu)建成數(shù)據(jù)結(jié)構(gòu)或?qū)ο蟮倪^(guò)程。 而本質(zhì)就是一種編碼規(guī)范。 在SOME/IP中使用序列化的目的和作用? 使數(shù)據(jù)按照固定格式進(jìn)行編排成為字

    2024年02月15日
    瀏覽(29)
  • Unity基于Google Protobuf序列化和反序列化小案例

    Unity基于Google Protobuf序列化和反序列化小案例

    1.協(xié)議定義,簡(jiǎn)單實(shí)現(xiàn)傳玩家的2D坐標(biāo)? ? 2.在Unity的Assets目錄下創(chuàng)建一個(gè)Plugins文件夾(必須這樣命名),此文件專(zhuān)門(mén)存放擴(kuò)展文件, 再新建文件夾BaseInfolibrary,將Google.Protobuf.dll拖入 ?3.新建一個(gè)Test.cs腳本 ?腳本中引入命名空間 代碼改進(jìn):通用序列化模板(只用來(lái)序列化Message)

    2024年02月15日
    瀏覽(28)
  • Protobuf-net:C#高效序列化工具,助力接口傳輸與前端解析

    Protobuf-net:C#高效序列化工具,助力接口傳輸與前端解析

    ? 概述: Protobuf-net是C#中高效的二進(jìn)制序列化工具,以緊湊、跨語(yǔ)言支持和卓越性能著稱。通過(guò)定義消息類(lèi)型、序列化和反序列化實(shí)現(xiàn)數(shù)據(jù)傳輸,并可適用于Web接口。前端可使用protobuf.js庫(kù)解析Protobuf格式數(shù)據(jù)。 Protobuf-net(Protocol Buffers)是一種高效的二進(jìn)制序列化工具,具有

    2024年03月09日
    瀏覽(33)
  • 【軟考網(wǎng)絡(luò)管理員】2023年軟考網(wǎng)管初級(jí)常見(jiàn)知識(shí)考點(diǎn)(13)-ARP、ICMP、IPv6協(xié)議詳解

    【軟考網(wǎng)絡(luò)管理員】2023年軟考網(wǎng)管初級(jí)常見(jiàn)知識(shí)考點(diǎn)(13)-ARP、ICMP、IPv6協(xié)議詳解

    #涉及知識(shí)點(diǎn) ARP協(xié)議詳解、ICMP協(xié)議詳解、IPv6協(xié)議等軟考內(nèi)容詳解 軟考網(wǎng)絡(luò)管理員??贾R(shí)點(diǎn),軟考網(wǎng)絡(luò)管理員網(wǎng)絡(luò)安全,網(wǎng)絡(luò)管理員考點(diǎn)匯總。 原創(chuàng)于:CSDN博主-《拄杖盲學(xué)輕聲碼》,更多考點(diǎn)匯總可以去他主頁(yè)查看 更多考試總結(jié)可關(guān)注CSDN博主-《拄杖盲學(xué)輕聲碼》 在網(wǎng)絡(luò)

    2024年02月11日
    瀏覽(24)
  • [Linux] 初識(shí)應(yīng)用層協(xié)議: 序列化與反序列化、編碼與解碼、jsoncpp簡(jiǎn)單使用...

    [Linux] 初識(shí)應(yīng)用層協(xié)議: 序列化與反序列化、編碼與解碼、jsoncpp簡(jiǎn)單使用...

    有關(guān)Linux網(wǎng)絡(luò), 之前的文章已經(jīng)簡(jiǎn)單演示介紹了 UDP 、 TCP 套接字編程 相關(guān)文章: [Linux] 網(wǎng)絡(luò)編程 - 初見(jiàn)UDP套接字編程: 網(wǎng)絡(luò)編程部分相關(guān)概念、TCP、UDP協(xié)議基本特點(diǎn)、網(wǎng)絡(luò)字節(jié)序、socket接口使用、簡(jiǎn)單的UDP網(wǎng)絡(luò)及聊天室實(shí)現(xiàn)… [Linux] 網(wǎng)絡(luò)編程 - 初見(jiàn)TCP套接字編程: 實(shí)現(xiàn)簡(jiǎn)單的單

    2024年02月15日
    瀏覽(28)
  • [golang 微服務(wù)] 3. ProtoBuf認(rèn)識(shí),安裝以及golang 中ProtoBuf使用

    [golang 微服務(wù)] 3. ProtoBuf認(rèn)識(shí),安裝以及golang 中ProtoBuf使用

    在移動(dòng)互聯(lián)網(wǎng)時(shí)代, 手機(jī)流量 、 電量 是最為有限的資源,而移動(dòng)端的即時(shí)通訊應(yīng)用無(wú)疑必須得直面這兩點(diǎn)。解決流量過(guò)大的基本方法就是 使用高度壓縮的 通信協(xié)議 ,而數(shù)據(jù)壓縮后流量減小帶來(lái)的自然結(jié)果也就是省電:因?yàn)榇髷?shù)據(jù)量的傳輸必然需要 更久的網(wǎng)絡(luò)操作 、 數(shù)據(jù)

    2024年02月10日
    瀏覽(25)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包