protocol buffers指南------Any聪蘸、Oneof、map

Any

  • 作為嵌套類型表制,不用include定義
  • 包含任意序列化的消息(字節(jié))健爬,以及一個URL,該URL充當該消息的全局唯一標識符并解析為該消息的類型么介。

使用Any類型, 需要導入google/protobuf/any.proto.

官方示例

import "google/protobuf/any.proto";

message ErrorStatus {
  string message = 1;
  repeated google.protobuf.Any details = 2;
}

指定消息類型的默認類型URL是type.googleapis.com/packagename.messagename
不同的語言實現(xiàn)將支持運行時庫助手以typesafe方式打包和解壓縮ANY類型的值——例如娜遵,在Java中,任何類型都有特殊的pack()和unpack()訪問器夭拌,而在c++中有PackFrom()和UnpackTo()方法:

// Storing an arbitrary message type in Any.
NetworkErrorDetails details = ...;
ErrorStatus status;
status.add_details()->PackFrom(details);

// Reading an arbitrary message from Any.
ErrorStatus status = ...;
for (const Any& detail : status.details()) {
  if (detail.Is<NetworkErrorDetails>()) {
    NetworkErrorDetails network_error;
    detail.UnpackTo(&network_error);
    ... processing network_error ...
  }
}

更多功能還在開發(fā)中魔熏,可以關(guān)注版本的迭代情況

Oneof

如果您有一條包含許多字段的消息衷咽,并且最多同時設(shè)置一個字段鸽扁,您可以使用其中oneof功能來強制執(zhí)行此行為并節(jié)省內(nèi)存。

Oneof 字段類似于常規(guī)字段镶骗,除了Oneof共享內(nèi)存的所有字段之外桶现,最多可以同時設(shè)置一個字段。設(shè)置Oneof 的任何成員都會自動清除所有其他成員鼎姊。您可以使用case()或WhichOneof()方法檢查Oneof 中的哪個值被設(shè)置(如果有的話)骡和,具體取決于您選擇的語言相赁。

使用Oneof
在您的 .proto中定義一個oneof 關(guān)鍵字后跟著oneof 名稱,在本例中為test_oneof:

message SampleMessage {
oneof test_oneof {
string name = 4;
SubMessage sub_message = 9;
}
}
然后將您的oneof字段添加到oneof定義中慰于。您可以添加任何類型的字段钮科,但不能使用重復字段。

在生成的代碼中婆赠,oneof字段具有與常規(guī)字段相同的setter和getter方法。您還可以獲得一種特殊的方法來檢查中的哪個值(如果有的話)被設(shè)置。你可以在相關(guān)的API參考中找到更多關(guān)于你選擇的語言的API剃盾。

Oneof功能
設(shè)置oneof字段將自動清除oneof字段的所有其他成員坏逢。因此,如果您設(shè)置了幾個oneof字段妙黍,則只有最后一個字段仍然有值悴侵。

SampleMessage message;
message.set_name("name");
CHECK(message.has_name());
message.mutable_sub_message();   // Will clear name field.
CHECK(!message.has_name());
  • 如果解析器遇到同一oneof的多個成員,則在解析的消息中只使用最后一個成員拭嫁。
  • oneof不能重復可免。
  • 反射APIs適用于oneof字段。
  • 如果您正在使用c++做粤,請確保代碼不會導致內(nèi)存崩潰巴元。下面的示例代碼將導致內(nèi)存崩潰,因為它通過set_name()方法調(diào)用了已經(jīng)刪除掉的sub_message驮宴。
SampleMessage message;
SubMessage* sub_message = message.mutable_sub_message();
message.set_name("name");      // Will delete sub_message
sub_message->set_...            // Crashes here
  • 同樣在C++中逮刨,如果使用同一個帶有oneof類型數(shù)據(jù)的消息,兩個消息可以通過swap互相改變彼此的oneof
SampleMessage msg1;
msg1.set_name("name");
SampleMessage msg2;
msg2.mutable_sub_message();
msg1.swap(&msg2);
CHECK(msg1.has_sub_message());
CHECK(msg2.has_name());

Maps

創(chuàng)建關(guān)聯(lián)映射

map<key_type, value_type> map_field = N;

其中key_type可以是任何整數(shù)或字符串類型(除浮點類型和字節(jié)以外的任何標量類型)堵泽。枚舉不是有效的key_type,value_type可以是除map之外的任何類型修己。

例如,如果您想為一個項目創(chuàng)建map迎罗,其中每個消息都與一個字符串鍵相關(guān)聯(lián)睬愤,您可以這樣定義它:

map<string, Project> projects = 3;
  • map不能設(shè)置為repeated

  • map的遍歷是無序的

  • 為proto生成文本格式時,map按key排序纹安。數(shù)字key按數(shù)字排序尤辱。

  • 從線上解析或合并時,如果有重復的map鍵厢岂,則使用最后的鍵光督。從文本格式解析map時,如果存在重復的鍵塔粒,解析可能會失敗结借。

  • 如果為映射字段提供了鍵但沒有值,則序列化該字段時的行為取決于語言卒茬。在c++船老、Java和Python中咖熟,序列化該類型的默認值,而在其他語言中柳畔,不進行序列化馍管。

更多map的api參考 API reference

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市薪韩,隨后出現(xiàn)的幾起案子咽斧,更是在濱河造成了極大的恐慌,老刑警劉巖躬存,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件张惹,死亡現(xiàn)場離奇詭異,居然都是意外死亡岭洲,警方通過查閱死者的電腦和手機宛逗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盾剩,“玉大人雷激,你說我怎么就攤上這事「嫠剑” “怎么了屎暇?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長驻粟。 經(jīng)常有香客問我根悼,道長,這世上最難降的妖魔是什么蜀撑? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任挤巡,我火速辦了婚禮,結(jié)果婚禮上酷麦,老公的妹妹穿的比我還像新娘矿卑。我一直安慰自己,他們只是感情好沃饶,可當我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布母廷。 她就那樣靜靜地躺著,像睡著了一般糊肤。 火紅的嫁衣襯著肌膚如雪琴昆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天轩褐,我揣著相機與錄音椎咧,去河邊找鬼玖详。 笑死把介,一個胖子當著我的面吹牛勤讽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拗踢,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼脚牍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了巢墅?” 一聲冷哼從身側(cè)響起诸狭,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎君纫,沒想到半個月后驯遇,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡蓄髓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年叉庐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片会喝。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡陡叠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出肢执,到底是詐尸還是另有隱情枉阵,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布预茄,位于F島的核電站兴溜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏耻陕。R本人自食惡果不足惜昵慌,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望淮蜈。 院中可真熱鬧斋攀,春花似錦、人聲如沸梧田。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽裁眯。三九已至鹉梨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間穿稳,已是汗流浹背存皂。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人旦袋。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓骤菠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親疤孕。 傳聞我的和親對象是個殘疾皇子商乎,可洞房花燭夜當晚...
    茶點故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 簡介 Protocol Buffers 是 google 的一種數(shù)據(jù)交換的格式,它獨立于語言祭阀,獨立于平臺鹉戚。goog...
    陳HHH閱讀 874評論 0 0
  • 個人覺得抹凳,有谷歌翻譯,百度翻譯伦腐。加上自己的理解却桶。自個看看官方文檔也還不錯。下面98%是谷歌翻譯跟百度翻譯的蔗牡。剩余2...
    言十年閱讀 377評論 0 1
  • 由于工程項目中擬采用一種簡便高效的數(shù)據(jù)交換格式颖系,百度了一下發(fā)現(xiàn)除了采用 xml、JSON 還有 ProtoBuf(...
    黃海佳閱讀 48,579評論 1 23
  • Protocol Buffers 是一種與語言無關(guān)辩越,平臺無關(guān)的可擴展機制嘁扼,用于序列化結(jié)構(gòu)化數(shù)據(jù)。使用Protoco...
    butters001閱讀 2,452評論 0 1
  • 表情是什么黔攒,我認為表情就是表現(xiàn)出來的情緒趁啸。表情可以傳達很多信息。高興了當然就笑了督惰,難過就哭了不傅。兩者是相互影響密不可...
    Persistenc_6aea閱讀 124,450評論 2 7