Protobuf是google 的一種數據交換的格式,它獨立于語言,獨立于平臺,簡單說就是后臺、安卓、IOS、PC各端都可以使用這種格式來通信
ProtoBuf 是google團隊開發的用于高效存儲和讀取結構化數據的工具。XML、JSON 也可以用來存儲此類結構化數據,但是使用ProtoBuf表示的數據能更加高效,并且將數據壓縮得更小。
優點
protobuf優點就是傳輸效率快(據說在數據量大的時候,傳輸效率比xml和json快10-20倍),序列化后體積相比Json和XML很小,支持跨平臺多語言,消息格式升級和兼容性還不錯,序列化反序列化速度很快。
缺點:
json缺點就是傳輸效率也不是特別高(比xml快,但比protobuf要慢很多)。
xml缺點就是效率不高,資源消耗過大。
protobuf缺點個人覺得使用不太方便。
原理
ProtoBuf 是通過ProtoBuf編譯器將與編程語言無關的特有的 .proto 后綴的數據結構文件編譯成各個編程語言(Java,C/C++,Python)專用的類文件,然后通過Google提供的各個編程語言的支持庫lib即可調用API。(關于proto結構體怎么編寫,可自行查閱文檔)
一、使用背景
都知道PB的優點是速度快,體積小,更高效,而我們項目原生已經替換了兩個版本,Flutter 側要也必須要完成適配,否則后臺如果是PB格式返回的接口,就只能使用原生,不能使用Flutter去請求了,這個就需要Android、IOS端各自開發。如果Flutter 也完成適配,就不需要原生實現,直接Flutter 側完成即可。
二、環境安裝
目前整個項目Flutter側基本是我一個人在負責,所以使用PB,必須要把環境搭建好,否則有問題出現就來不及了。
這個環境安裝其實耗費了不少心思。。。。
1.首先安裝protobuf
brew install protobuf
執行這個命名后,我一直卡在 Homebrew update... 然后不動,一兩小時候,出現報錯
error: RPC failed; curl 56 LibreSSL SSL_read: SSL_ERROR_SYSCALL
解決方案:
Mac 執行brew install ...一直卡在Updating Homebrew的解決方案
# 1\. 編輯配置文件
vim ~/.bash_profile
# 2\. 文件內新增一行
export HOMEBREW_NO_AUTO_UPDATE=true
# 3\. 重新加載配置文件
source ~/.bash_profile
2.安裝dart
brew tap dart-lang/dart
brew install dart
這個過程報錯: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:翻墻(我是用的這個) 這個zip 體積比較大158MB
方案2:可參考這個 先手動下載 放到brew緩存,再次執行該命令行:
a.瀏覽器訪問上面的zip文件,下載完畢后
brew --cache
控制臺顯示地址為:
/Users/zhouhao/Library/Caches/Homebrew
b.最后將下載下來的文件 拷貝到 上面緩存地址:
cp ~/Downloads/dartsdk-macos-x64-release.zip /Users/yourusername/Library/Caches/Homebrew
c.接著再執行命令就可以正常安裝成功
brew install dart
不清楚可以看看這個鏈接:
https://www.cnblogs.com/lmyupupblogs/p/12785753.html
PS : 如果上面的不行,我建議重啟下,執行,還是不行,我就遇到一次,直接解壓剛下載的壓縮包,然后dart-sdk /bin 這個 全路徑 配置到 .bash_profile中。配置環境變量
然后命令行輸入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 配置進環境變量 ,然后執行source .bash_profile 生效。整個環境就安裝完畢。
三、proto文件轉換為dart文件
執行如下 報錯:
$ protoc --dart_out=. /Users/XXX/Desktop/Flutte開發資料/pb文件/Adversity.proto
/Users/XXX/Desktop/Flutte開發資料/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).
報錯說沒找到 我的.proto文件 需要加上 --proto_path (or -I).
然后我再次執行:
protoc --dart_out=. /Users/xxx/Desktop/Flutte開發資料/pb文件/Adversity.prot -I /Users/xxx/Desktop/Flutte開發資料/pb文件
解釋下上面這個命令,我也搗鼓了一會才搞清楚:
protoc : 命令標記
--dart_out=. :生成dart 文件到當前執行命令的路徑 因為是 . 想生成到其他位置自己調整;
/Users/xxx/Desktop/Flutte開發資料/pb文件/Adversity.proto
:需要轉換為dart文件的 .proto 源文件路徑
-I /Users/xxx/Desktop/Flutte開發資料/pb文件
:-I 就是要指定的類型 源文件的上層文件夾
執行上述命令,會生成以下文件:
上面幾個文件 不一定全部需要