Flutter 中使用Protobuf姿勢(shì)

Protobuf是google 的一種數(shù)據(jù)交換的格式,它獨(dú)立于語(yǔ)言,獨(dú)立于平臺(tái),簡(jiǎn)單說(shuō)就是后臺(tái)、安卓、IOS、PC各端都可以使用這種格式來(lái)通信

ProtoBuf 是google團(tuán)隊(duì)開發(fā)的用于高效存儲(chǔ)和讀取結(jié)構(gòu)化數(shù)據(jù)的工具。XML、JSON 也可以用來(lái)存儲(chǔ)此類結(jié)構(gòu)化數(shù)據(jù),但是使用ProtoBuf表示的數(shù)據(jù)能更加高效,并且將數(shù)據(jù)壓縮得更小。

優(yōu)點(diǎn)

protobuf優(yōu)點(diǎn)就是傳輸效率快(據(jù)說(shuō)在數(shù)據(jù)量大的時(shí)候,傳輸效率比xml和json快10-20倍),序列化后體積相比Json和XML很小,支持跨平臺(tái)多語(yǔ)言,消息格式升級(jí)和兼容性還不錯(cuò),序列化反序列化速度很快。

缺點(diǎn):

json缺點(diǎn)就是傳輸效率也不是特別高(比xml快,但比protobuf要慢很多)。
xml缺點(diǎn)就是效率不高,資源消耗過大。
protobuf缺點(diǎn)個(gè)人覺得使用不太方便。

原理

ProtoBuf 是通過ProtoBuf編譯器將與編程語(yǔ)言無(wú)關(guān)的特有的 .proto 后綴的數(shù)據(jù)結(jié)構(gòu)文件編譯成各個(gè)編程語(yǔ)言(Java,C/C++,Python)專用的類文件,然后通過Google提供的各個(gè)編程語(yǔ)言的支持庫(kù)lib即可調(diào)用API。(關(guān)于proto結(jié)構(gòu)體怎么編寫,可自行查閱文檔)

一、使用背景

都知道PB的優(yōu)點(diǎn)是速度快,體積小,更高效,而我們項(xiàng)目原生已經(jīng)替換了兩個(gè)版本,F(xiàn)lutter 側(cè)要也必須要完成適配,否則后臺(tái)如果是PB格式返回的接口,就只能使用原生,不能使用Flutter去請(qǐng)求了,這個(gè)就需要Android、IOS端各自開發(fā)。如果Flutter 也完成適配,就不需要原生實(shí)現(xiàn),直接Flutter 側(cè)完成即可。

二、環(huán)境安裝

目前整個(gè)項(xiàng)目Flutter側(cè)基本是我一個(gè)人在負(fù)責(zé),所以使用PB,必須要把環(huán)境搭建好,否則有問題出現(xiàn)就來(lái)不及了。

這個(gè)環(huán)境安裝其實(shí)耗費(fèi)了不少心思。。。。

1.首先安裝protobuf
brew install protobuf

執(zhí)行這個(gè)命名后,我一直卡在 Homebrew update... 然后不動(dòng),一兩小時(shí)候,出現(xiàn)報(bào)錯(cuò)

error: RPC failed; curl 56 LibreSSL SSL_read: SSL_ERROR_SYSCALL

解決方案:

Mac 執(zhí)行brew install ...一直卡在Updating Homebrew的解決方案

# 1\. 編輯配置文件
vim ~/.bash_profile

# 2\. 文件內(nèi)新增一行
export HOMEBREW_NO_AUTO_UPDATE=true

# 3\. 重新加載配置文件
source ~/.bash_profile
2.安裝dart
brew tap dart-lang/dart
brew install dart

這個(gè)過程報(bào)錯(cuò):Error: Failed to download resource "dart"
Download failed: https://storage.googleapis.com/dart-archive/channels/stable/release/2.10.4/sdk/dartsdk-macos-x64-release.zip

解決方案:
方案1:翻墻(我是用的這個(gè)) 這個(gè)zip 體積比較大158MB
方案2:可參考這個(gè) 先手動(dòng)下載 放到brew緩存,再次執(zhí)行該命令行:
a.瀏覽器訪問上面的zip文件,下載完畢后
brew --cache
控制臺(tái)顯示地址為:

/Users/zhouhao/Library/Caches/Homebrew

b.最后將下載下來(lái)的文件 拷貝到 上面緩存地址:

cp ~/Downloads/dartsdk-macos-x64-release.zip /Users/yourusername/Library/Caches/Homebrew

c.接著再執(zhí)行命令就可以正常安裝成功

brew install dart

不清楚可以看看這個(gè)鏈接:
https://www.cnblogs.com/lmyupupblogs/p/12785753.html
PS : 如果上面的不行,我建議重啟下,執(zhí)行,還是不行,我就遇到一次,直接解壓剛下載的壓縮包,然后dart-sdk /bin 這個(gè) 全路徑 配置到 .bash_profile中。配置環(huán)境變量
然后命令行輸入dart 就可以了

3.安裝protoc_plugin

dart 安裝好后,就可以使用pub命令

pub global activate protoc_plugin

將protoc-gen-dart添加到path ,在用戶根目錄:.bash_profile添加 ,安裝好后,就有protoc-gen-dart 命令了。

export "$PATH:$PWD/.pub-cache/bin"

按照上面的Vim .bash_profile 配置進(jìn)環(huán)境變量 ,然后執(zhí)行source .bash_profile 生效。整個(gè)環(huán)境就安裝完畢。

三、proto文件轉(zhuǎn)換為dart文件

執(zhí)行如下 報(bào)錯(cuò):

$ protoc --dart_out=. /Users/XXX/Desktop/Flutte開發(fā)資料/pb文件/Adversity.proto 

/Users/XXX/Desktop/Flutte開發(fā)資料/pb文件/Adversity.proto: File does not reside within any path specified using --proto_path (or -I).  You must specify a --proto_path which encompasses this file.  Note that the proto_path must be an exact prefix of the .proto file names -- protoc is too dumb to figure out when two paths (e.g. absolute and relative) are equivalent (it's harder than you think).

報(bào)錯(cuò)說(shuō)沒找到 我的.proto文件 需要加上 --proto_path (or -I).
然后我再次執(zhí)行:

protoc --dart_out=. /Users/xxx/Desktop/Flutte開發(fā)資料/pb文件/Adversity.prot -I /Users/xxx/Desktop/Flutte開發(fā)資料/pb文件

解釋下上面這個(gè)命令,我也搗鼓了一會(huì)才搞清楚:
protoc : 命令標(biāo)記
--dart_out=. :生成dart 文件到當(dāng)前執(zhí)行命令的路徑 因?yàn)槭? . 想生成到其他位置自己調(diào)整;
/Users/xxx/Desktop/Flutte開發(fā)資料/pb文件/Adversity.proto
:需要轉(zhuǎn)換為dart文件的 .proto 源文件路徑
-I /Users/xxx/Desktop/Flutte開發(fā)資料/pb文件
:-I 就是要指定的類型 源文件的上層文件夾

執(zhí)行上述命令,會(huì)生成以下文件:


image.png

上面幾個(gè)文件 不一定全部需要

到這里,幾乎全部介紹Flutter中使用protobuf的文章都到此為止。截止到12月10日,我搜索了至少50篇博客,每一個(gè)一個(gè)寫了flutter 中到底怎么用protobuf.

!?。。。。?!具體使用請(qǐng)看下面這篇文章?。。。。。。。。?/h4>

傳送門:http://www.itdecent.cn/p/5952bdc36496

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容