protocol buffers指南------定義消息類型

定義消息類型

話不多說首先我們來看一個非常簡單的例子。
定義一個查詢請求消息格式, 每個查詢請求有一個查詢語句窜护,為了減少一次查詢量睡腿,我們經常做分頁查詢,查詢結果的第幾頁/每頁結果數量爷光。如下:

syntax = "proto3";

message SearchRequest {
  string query = 1;
  int32 page_number = 2;
  int32 result_per_page = 3;
}

  1. 第一行指明當前使用的是proto3語法, 如果不指定則默認為proto2垫竞。必須是.proto文件的除空行和注釋內容之外的第一行
  2. SearchRequest 消息定義指明了3個字段。每個字段有名字和類型.

字段類型

上面例子中, 所有字段都是Scalar Types/標量(通俗說基礎)類型(后面會詳細講述), 包括兩個int32和一個string. 此外還可以支持復合類型包括枚舉類型.

指定標簽

可以看到消息定義的每個字段都有一個唯一的數字型標簽. 這個標簽用于在消息的二進制格式中標識字段, 一旦消息類型被使用后不可以再修改.

標簽的值在1和15之間時編碼只需一個字節(jié)蛀序,包括標識值和字段類型欢瞪。標簽在16到2047之間將占用兩個字節(jié)。因此應該將從1到15的標簽分派給最頻繁出現(xiàn)的消息元素哼拔。記得保留一些空間給以后可能添加的頻繁出現(xiàn)的元素.

可以指定的最小的標簽值是1, 最大的是2的29次方-1, 即536870911引有。 另外19000到19999(FieldDescriptor::kFirstReservedNumber through FieldDescriptor::kLastReservedNumber)不能使用, 是Protocol Buffers的實現(xiàn)自己保留這個標簽段.

指定字段規(guī)則

消息字段可以是下列之一:

  1. singular: 一個定義良好的消息可以有0個或1個此字段(但是不能超過1個),該規(guī)則是V3版本默認規(guī)則
  2. repeated: 這個字段可以在定義好的消息中重復任意次(包括0次)倦逐,重復值的順序和原順序一致(類似于數組)譬正。

V3版本中,基礎類型定義額repeated會默認進行packed編碼以提高效率檬姥。例如:

 repeated int32 samples = 4 [packed=true];

添加更多消息類型

可以在單個 .proto 文件中定義多個消息類型. 推薦定義多個相關消息, 例如, 如果你想定義應答消息格式來相應你的SearchResponse消息類型,建議放到同一個.proto文件.

message SearchRequest {
  string query = 1;
  int32 page_number = 2;
  int32 result_per_page = 3;
}

message SearchResponse {
 ...
}

添加注釋

可以使用C/C++風格的"http://"語法在.proto文件中添加注釋曾我;或者"/****/"

/* SearchRequest represents a search query, with pagination options to
 * indicate which results to include in the response. */

message SearchRequest {
  string query = 1;
  int32 page_number = 2;  // Which page number do we want?
  int32 result_per_page = 3;  // Number of results to return per page.
}

保留字段

當你更新pb文件版本時,需要刪除一個字段時, 或者注釋掉它, 后續(xù)的新的接口版本重用這個標簽的數字健民,而已有的老版本程序仍然使用.proto文件的老版本,就會出現(xiàn)bug抒巢。 為了確保防止該bug產生, 我們可以指明這個要刪除的字段為保留字段.。如果未來任何用戶試圖復用這個字段標識protocol buffer的編譯器就會告警秉犹。

message Foo {
  reserved 2, 15, 9 to 11;
  reserved "foo", "bar";
}

注意: 不能在同一個保留字段聲明中混合使用名字和標簽數字

.proto可以生成什么?

對.proto文件執(zhí)行protocol buffer的編譯時蛉谜, 編輯器會生成你所選語言的代碼稚晚,用來處理你在文件中定義的消息類型, 包括讀寫字段值, 序列化消息到輸出流, 和從輸入流中解析消息.

  • 對于c++, 編譯器為每個.proto文件生成.h和.cc文件, 并為每個在文件中描述的消息類型生成一個類
  • 對于Java, 編譯器為每個消息類型生成一個.java文件, 還有用于創(chuàng)建消息實例的Builder類.
  • Python小有不同 - Python編譯器為.proto文件中的每個消息類型生成帶有靜態(tài)描述符的模塊, 這些模塊將和metaclass一起在運行時用來創(chuàng)建必須的Python數據訪問類.
  • 編譯器生成一個.pb.go文件, .proto文件中的每個消息類型在這個文件中都有一個類型.
  • 對于Ruby, 編譯器生成一個.rb文件, 帶用包含消息類型的Ruby模塊.
  • 對于JavaNano, 編譯器輸出類似java但是沒有builder類.
  • 對于Objective-C, 編譯器從每個.proto文件生成一個pbobjc.h和pbobjc.m文件,文件中描述的每個消息類型都有一個類.
  • 對于C#, 編譯器從每個.proto文件生成一個.cs文件,文件中描述的每個消息類型都有一個類.
  • 對于Go語言,編譯器針對一個.proto文件生成一個pb.go文件型诚,為每個message生成一個類型
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末客燕,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子狰贯,更是在濱河造成了極大的恐慌也搓,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,331評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涵紊,死亡現(xiàn)場離奇詭異傍妒,居然都是意外死亡,警方通過查閱死者的電腦和手機摸柄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,372評論 3 398
  • 文/潘曉璐 我一進店門颤练,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人塘幅,你說我怎么就攤上這事昔案。” “怎么了电媳?”我有些...
    開封第一講書人閱讀 167,755評論 0 360
  • 文/不壞的土叔 我叫張陵踏揣,是天一觀的道長。 經常有香客問我匾乓,道長捞稿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,528評論 1 296
  • 正文 為了忘掉前任拼缝,我火速辦了婚禮娱局,結果婚禮上,老公的妹妹穿的比我還像新娘咧七。我一直安慰自己衰齐,他們只是感情好,可當我...
    茶點故事閱讀 68,526評論 6 397
  • 文/花漫 我一把揭開白布继阻。 她就那樣靜靜地躺著耻涛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瘟檩。 梳的紋絲不亂的頭發(fā)上抹缕,一...
    開封第一講書人閱讀 52,166評論 1 308
  • 那天,我揣著相機與錄音墨辛,去河邊找鬼卓研。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的奏赘。 我是一名探鬼主播寥闪,決...
    沈念sama閱讀 40,768評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼磨淌!你這毒婦竟也來了橙垢?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,664評論 0 276
  • 序言:老撾萬榮一對情侶失蹤伦糯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后嗽元,有當地人在樹林里發(fā)現(xiàn)了一具尸體敛纲,經...
    沈念sama閱讀 46,205評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,290評論 3 340
  • 正文 我和宋清朗相戀三年剂癌,在試婚紗的時候發(fā)現(xiàn)自己被綠了淤翔。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,435評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡佩谷,死狀恐怖旁壮,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情谐檀,我是刑警寧澤抡谐,帶...
    沈念sama閱讀 36,126評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站桐猬,受9級特大地震影響麦撵,放射性物質發(fā)生泄漏。R本人自食惡果不足惜溃肪,卻給世界環(huán)境...
    茶點故事閱讀 41,804評論 3 333
  • 文/蒙蒙 一免胃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧惫撰,春花似錦羔沙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,276評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至莉撇,卻和暖如春呢蛤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背棍郎。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工其障, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人涂佃。 一個月前我還...
    沈念sama閱讀 48,818評論 3 376
  • 正文 我出身青樓励翼,卻偏偏與公主長得像蜈敢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子汽抚,可洞房花燭夜當晚...
    茶點故事閱讀 45,442評論 2 359

推薦閱讀更多精彩內容