Google Protobuf 3版本介紹

2021-09-26 07:20:52 字數 1971 閱讀 4682

google protobuf 3版本介紹

本文編寫時, google 官方的 protobuf 版本是3.0.0beta

下面介紹下proto3的一些細節變化

proto3的語法變化

語法標記

這個版本的protoc的protobuf編譯器已經可以支援proto2語法和proto3的語法

如果你的proto檔案沒有新增syntax說明的話, 用這個版本的編譯器會報錯, 提示你預設proto2支援, 請新增語法標記

syntax = "proto2";

optional不需要了

只保留repeated標記陣列型別, optional和required都被去掉了

實際使用證明, required的設計確實是蛋疼, c++的除錯版會彈出assert,release版和optional也沒啥區別

map支援

map編寫格式為

mapmap_field = n;

例如:mapprojects = 3;

**生成確認支援map, 這對於很多語言來說又可以偷懶了

欄位default標記不能使用了

位於proto2語法的字段number後的[default=xx]

這個東西不能用了, 理由是:

對於同一段序列化後的資料, 如果序列化端的default和反序列化端的default描述不一樣會導致最終結果完全不一致

即: 同乙個資料兩個結果, 這是不可**的結果, 因此乾掉這個特性

不過本人覺得, 對於遊戲來說, 這個功能本身可以壓縮很多資料,雖然會有隱患

列舉預設值一定是0

proto2裡的預設值是列舉的第乙個value對應的值, 不一定為0

proto3在你定義value時, 強制要求第乙個值必須為0

這個修改為避免隱患還是有幫助的

泛型描述支援

any型別, 可以代表任何型別, 可以先讀進來, 再進行解析, 沒具體用, 步子跨大了怕扯到蛋

支援json序列化

這個極好, json再次被同化了

增加了多種語言支援

js, objc, ruby, c#等等

然而, c#版本的基礎runtime庫是用c# 6.0的語法寫的,這對於unity mono祖傳2.0來說, 確實扯到蛋了,沒法用

protobuf現在使用cmake做配置系統

編譯起來稍微麻煩, 還要下個被牆掉的cmake…

第三方庫里對於proto3的變化

golang的官方protobuf支援:

生成**中的結構體欄位型別變化

對於proto2的檔案, 生成的go**中的結構體依然使用型別指標作為預設儲存, 相容老的系統

對於proto3的檔案, 生成的go**中的結構體直接使用字段作為預設儲存, 不再使用get***來作為字段值訪問, 賦值時也無需使用proto.型別() 函式進行指標型別字段值建立.

這個調整很是方便, 但丟失了optional判斷功能, 對應c++裡就是has***的功能, 不過好歹這個邏輯現在用的不多了

這個修改大概也是配合json序列化來做的, go預設的json序列化時, 無法使用proto2生成的結構體的, 因為都是指標,無法賦值..

新版protoc-gen-go的外掛程式會生成descriptor的壓縮資料

新外掛程式會給每次生成的檔案新增這樣一段**

var filedescriptor0 = byte

對於meta資訊的提取還是很方便的

然而對於多個檔案的生成, 這樣做非常的麻煩, 因為這個欄位會重複導致編譯錯誤

很多人在論壇裡吐槽, 官方給出的解決方法是, 使用protoc一次性傳入乙個package下的所有的proto直接生成乙個go

而不是現在的乙個proto乙個go

生成**會自動註冊到全域性, 並可以方便的查詢

以前這個**需要自己來做, 現在官方提供了支援, 很是方便

然而, 為什麼不支援遍歷… 殘念啊, 又要自己動手了

谷歌 Google ProtoBuf用法例項

這裡貼乙個介紹貼 這裡就介紹怎麼安裝的了,安裝caffe的時候一起安裝的,這裡介紹一下怎麼用這個庫,caffe用他來當資料傳輸說明他很快 新建乙個proto定義資料傳輸的結構,這個和ros上資料傳輸很像 syntax proto2 package caffe 網域名稱 message person ...

Google Protobuf 請求引數為空的案例

google protobuf已經提供了空引數 message empty使用方法,在proto檔案中匯入empty.proto,定義乙個請求引數和返回值為空的函式emptyfunction,函式名字可以自定義。import google protobuf empty.proto service p...

Google protobuf使用技巧和經驗

google protobuf是非常出色的開源工具,在專案中可以用它來作為服務間資料互動的介面,例如rpc服務 資料檔案傳輸等。protobuf為proto檔案中定義的物件提供了標準的序列化和反序列化方法,可以很方便的對pb物件進行各種解析和轉換。以下是我總結的protobuf使用技巧和經驗,分享給...