protocol buffers指南------默認(rèn)值浙值、枚舉

默認(rèn)值

解析消息時(shí), 如果被編碼的消息沒(méi)有包含一個(gè)特定的元素, 被解析的對(duì)象對(duì)應(yīng)的字段被設(shè)置為默認(rèn)值. 默認(rèn)值是和類型有關(guān)的:

  • 對(duì)于strings, 默認(rèn)值是空字符串(注, 是"", 而不是null)
  • 對(duì)于bytes, 默認(rèn)值是空字節(jié)(注, 應(yīng)該是byte[0], 注意這里也不是null)
  • 對(duì)于bool, 默認(rèn)值是false.
  • 對(duì)于數(shù)字類型, 默認(rèn)值是0.
  • 對(duì)于枚舉, 默認(rèn)值是第一個(gè)定義的枚舉值, 而這個(gè)值必須是0.
  • 對(duì)于消息字段, 默認(rèn)值和語(yǔ)言相關(guān)查牌,參考generated code guide
  • 對(duì)于重復(fù)字段, 默認(rèn)值是空(通常都是空列表)

注意: 對(duì)于基本的消息字段, 當(dāng)消息被解析后, 是不知道該值是默認(rèn)值還是剛好設(shè)置了和默認(rèn)值相同的值(例如一個(gè)bool設(shè)置為false师痕,當(dāng)你不希望這個(gè)bool變量能控制程序的默認(rèn)行為躲舌,不要用一個(gè)bool值然后當(dāng)設(shè)置為false時(shí)來(lái)切換某些行為。同樣請(qǐng)注意: 如果一個(gè)簡(jiǎn)單消息字段被設(shè)置為它的默認(rèn)值, 這個(gè)值不會(huì)被序列化.

枚舉

簡(jiǎn)單示例

在下面的例子中, 服務(wù)消息中添加一個(gè)名為Corpus的枚舉類型, 定義好所有可能的值, 然后添加一個(gè)類型為Corpus的字段:

message SearchRequest {
  string query = 1;
  int32 page_number = 2;
  int32 result_per_page = 3;
  enum Corpus {
    UNIVERSAL = 0;
    WEB = 1;
    IMAGES = 2;
    LOCAL = 3;
    NEWS = 4;
    PRODUCTS = 5;
    VIDEO = 6;
  }
  Corpus corpus = 4;
}

如上, Corpus 枚舉的第一個(gè)常量設(shè)置到0: 每個(gè)枚舉定義必須包含一個(gè)映射到0的常量作為它的第一個(gè)元素. 這是因?yàn)?

  • 默認(rèn)值:必須有一個(gè)0值, 這樣我們才能用0來(lái)作為數(shù)值默認(rèn)值.
  • 兼容性:0值必須是第一個(gè)元素, 兼容proto2語(yǔ)法,在proto2中默認(rèn)值總是第一個(gè)枚舉值

別名設(shè)置

可以通過(guò)將相同值賦值給不同的枚舉常量來(lái)定義別名口予。需要設(shè)置allow_alias選項(xiàng)為true, 否則當(dāng)發(fā)現(xiàn)別名時(shí)protocol編譯器會(huì)報(bào)錯(cuò)娄周。

enum EnumAllowingAlias {
  option allow_alias = true;
  UNKNOWN = 0;
  STARTED = 1;
  RUNNING = 1;
}
enum EnumNotAllowingAlias {
  UNKNOWN = 0;
  STARTED = 1;
  // RUNNING = 1;  // Uncommenting this line will cause a compile error inside Google and a warning message outside.
}

注意事項(xiàng)

枚舉常量必須在32位整形的范圍內(nèi),由于枚舉值使用varint encoding沪停,如果設(shè)置為負(fù)值煤辨,效率比較低不推薦使用裳涛。你可以在消息定義中定義枚舉, 如前面例子, 或者在外部 - 這些枚舉可以在.proto文件的任意消息定義中復(fù)用。在一個(gè)消息中聲明的枚舉類型作為別的消息的字段類型, 需要使用語(yǔ)法MessageType.EnumType.

保留字段

當(dāng)你在某次更新消息中屏蔽或者刪除了一個(gè)字段的話众辨,未來(lái)的使用著可能在他們的更新中重用這個(gè)標(biāo)簽數(shù)字來(lái)標(biāo)記他們自己的字段端三。然后當(dāng)他們加載舊的消息的時(shí)候就會(huì)出現(xiàn)很多問(wèn)題,包括數(shù)據(jù)沖突鹃彻,隱藏的bug等等郊闯。指定這個(gè)字段的標(biāo)簽數(shù)字(或者名字,名字可能在序列化為JSON的時(shí)候可能沖突)標(biāo)記為reserved來(lái)保證他們不會(huì)再次被使用蛛株。如果以后的人試用的話protobuf編譯器會(huì)提示出錯(cuò)团赁。

enum Foo {
  reserved 2, 15, 9 to 11, 40 to max;  
  reserved "FOO", "BAR";
}

注意一個(gè)reserved字段不能既有標(biāo)簽數(shù)字又有名字。

注意:生成的枚舉類型數(shù)量代碼可能會(huì)受到語(yǔ)言限制(一般低于1000泳挥,具體參考語(yǔ)言類型限制)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末然痊,一起剝皮案震驚了整個(gè)濱河市至朗,隨后出現(xiàn)的幾起案子屉符,更是在濱河造成了極大的恐慌,老刑警劉巖锹引,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件矗钟,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡嫌变,警方通過(guò)查閱死者的電腦和手機(jī)吨艇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)腾啥,“玉大人东涡,你說(shuō)我怎么就攤上這事√却” “怎么了疮跑?”我有些...
    開(kāi)封第一講書人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)凸舵。 經(jīng)常有香客問(wèn)我祖娘,道長(zhǎng),這世上最難降的妖魔是什么啊奄? 我笑而不...
    開(kāi)封第一講書人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任渐苏,我火速辦了婚禮,結(jié)果婚禮上菇夸,老公的妹妹穿的比我還像新娘琼富。我一直安慰自己,他們只是感情好庄新,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布公黑。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪凡蚜。 梳的紋絲不亂的頭發(fā)上人断,一...
    開(kāi)封第一講書人閱讀 52,328評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音朝蜘,去河邊找鬼恶迈。 笑死,一個(gè)胖子當(dāng)著我的面吹牛谱醇,可吹牛的內(nèi)容都是我干的暇仲。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼副渴,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼奈附!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起煮剧,我...
    開(kāi)封第一講書人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤斥滤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后勉盅,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體佑颇,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年草娜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了挑胸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡宰闰,死狀恐怖茬贵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情移袍,我是刑警寧澤解藻,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站咐容,受9級(jí)特大地震影響舆逃,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜戳粒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一路狮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蔚约,春花似錦奄妨、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)评雌。三九已至,卻和暖如春直焙,著一層夾襖步出監(jiān)牢的瞬間景东,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工奔誓, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留斤吐,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓厨喂,卻偏偏與公主長(zhǎng)得像和措,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蜕煌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

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

  • proto3默認(rèn)值與可選項(xiàng) 內(nèi)容簡(jiǎn)介:proto3默認(rèn)值與可選項(xiàng) 本文轉(zhuǎn)載自:http://kaelzhang81...
    XBruce閱讀 1,270評(píng)論 0 1
  • 2017年推出的 Codable 無(wú)疑是 Swift 的一大飛躍派阱。盡管當(dāng)時(shí)社區(qū)已經(jīng)構(gòu)建了多種用于本地 Swift ...
    韋弦Zhy閱讀 790評(píng)論 0 2
  • 由于工程項(xiàng)目中擬采用一種簡(jiǎn)便高效的數(shù)據(jù)交換格式,百度了一下發(fā)現(xiàn)除了采用 xml斜纪、JSON 還有 ProtoBuf(...
    黃海佳閱讀 48,690評(píng)論 1 23
  • 表情是什么贫母,我認(rèn)為表情就是表現(xiàn)出來(lái)的情緒。表情可以傳達(dá)很多信息傀广。高興了當(dāng)然就笑了颁独,難過(guò)就哭了彩届。兩者是相互影響密不可...
    Persistenc_6aea閱讀 125,318評(píng)論 2 7
  • 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險(xiǎn)厭惡者伪冰,不喜歡去冒險(xiǎn),但是人生放棄了冒險(xiǎn)樟蠕,也就放棄了無(wú)數(shù)的可能贮聂。 ...
    yichen大刀閱讀 6,057評(píng)論 0 4