日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

protocol buffer没那么难,不信你看这篇

發布時間:2024/2/28 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 protocol buffer没那么难,不信你看这篇 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 簡介
  • 定義一個消息
    • 類型定義
    • 字段的值
    • 字段描述符
    • 添加注釋
  • 嵌套類型
  • Map
  • 總結

簡介

上一篇文章我們對google的protobuf已經有了一個基本的認識,并且能夠使用相應的工具生成對應的代碼了。但是對于.proto文件的格式和具體支持的類型還不是很清楚。今天本文將會帶大家一探究竟。

注意,本文介紹的協議是proto3版本的。

定義一個消息

protobuf中的主體被稱為是message,可以將其看做是我們在程序中定義的類。我們可以在.proto文件中定義這個message對象,并且為其添加屬性,如下所示:

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

上例的第一行指定了.proto文件的協議類型,這里使用的是proto3,也是最新版的協議,如果不指定,默認情況下是proto2。

類型定義

這里我們為SearchRequest對象,定義了三個屬性,其類型分別是String和int32。

String和int32都是簡單類型,protobuf支持的簡單類型如下:

protobuf類型說明對應的java類型
double雙精度浮點類型double
float浮點類型float
int32整型數字,最好不表示負數int
int64整型數字,最好不表示負數long
uint32無符號整數int
uint64無符號整數long
sint32帶符號整數int
sint64帶符號整數long
fixed32四個字節的整數int
fixed648個字節的整數long
sfixed324個字節的帶符號整數int
sfixed648個字節的帶符號整數long
bool布爾類型boolean
string字符串String
bytes字節ByteString

當然protobuf還支持復雜的組合類型和枚舉類型。

枚舉類型在protobuf中用enum來表示,我們來看一個枚舉類型的定義:

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,枚舉類型中定義的枚舉值是從0開始的,0也是枚舉類型的默認值。

在枚舉中,還可以定義具有相同value的枚舉類型,但是這樣需要加上allow_alias=true的選項,如下所示:

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

在枚舉類型中,如果我們后續對某些枚舉類型進行了刪除,那么被刪除的值可能會被后續的用戶使用,這樣就會造成潛在的代碼隱患,為了解決這個問題,枚舉提供了一個reserved的關鍵詞,被這個關鍵詞聲明的枚舉類型,就不會被后續使用,如下所示:

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

reserved關鍵字也可以用在message的字段中,表示后續不要使用到這些字段,如下:

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

字段的值

我們可以看到,每個message的字段都分配了一個值,每個字段的值在message中都是唯一的,這些值是用來定位在二進制消息格式中的字段位置。所以一旦定義之后,不要隨意修改。

要注意的是值1-15在二進制中使用的1個字節來表示的,值16-2047需要使用2個字節來表示,所以通常將1-15使用在最常見的字段和可能重復的字段,這樣可以節約編碼后的空間。

最小的值是1,最大的值是2的29次方-1,或者536,870,911。這中間從19000-19999是保留數字,不能使用。

當消息被編譯之后,各個字段將會被轉成為對應的類型,并且各個字段類型將會被賦予不同的初始值。

strings的默認值是空字符串,bytes的默認值是空bytes,bools的默認值是false,數字類型的默認值是0,枚舉類型的默認值是枚舉的第一個元素。

字段描述符

每個消息的字段都可以有兩種描述符,第一種叫做singular,表示message中可以有0個或者1個這個字段,這是proto3中默認的定義方式。

第二種叫做repeated,表示這個字段在message中是可以重復的,也就是說它代表的是一個集合。

添加注釋

在proto中的注釋和C++的風格類似,可以使用: // 或者 /* … */ 的風格來注釋,如下所示:

/* 這是一個注釋. */message SearchRequest {string query = 1;int32 page_number = 2; // 頁面的numberint32 result_per_page = 3; // 每頁的結果 }

嵌套類型

在一個message中還可以嵌入一個message,如下所示:

message SearchResponse {message Result {string url = 1;string title = 2;repeated string snippets = 3;}repeated Result results = 1; }

在上例中,我們在SearchResponse定義了一個Result類型,在java中,實際上可以將其看做是嵌套類。

如果希望在message的定義類之外使用這個內部的message,則可以通過_Parent_._Type_來定義:

message SomeOtherMessage {SearchResponse.Result result = 1; }

嵌套類型可以任意嵌套,如下所示:

message Outer { // Level 0message MiddleAA { // Level 1message Inner { // Level 2int64 ival = 1;bool booly = 2;}}message MiddleBB { // Level 1message Inner { // Level 2int32 ival = 1;bool booly = 2;}} }

Map

如果想要在proto中定義map,可以這樣寫:

map<key_type, value_type> map_field = N;

這里的value_type可以是除map之外的任意類型。注意map不能是repeated。

map中的數據的順序是不定的,我們不能依賴存入的map順序來判斷其取出的順序。

總結

以上就是proto3中定義聲明文件該注意的事項了,大家在使用protobuf的時候要多加注意。

本文已收錄于 http://www.flydean.com/02-protocolbuf-detail/

最通俗的解讀,最深刻的干貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!

歡迎關注我的公眾號:「程序那些事」,懂技術,更懂你!

總結

以上是生活随笔為你收集整理的protocol buffer没那么难,不信你看这篇的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 免费av电影网站 | 亚洲三级视频在线观看 | 日本十八禁视频无遮挡 | 欧美黑人狂野猛交老妇 | 亚洲区小说区图片区 | 欧美三级一级片 | 欧美日韩一区二区在线 | a毛片网站| 少妇高潮喷水在线观看 | 99久在线精品99re8热 | 中文字幕第二页 | 亚洲免费福利视频 | 今天高清视频在线观看视频 | 性欧美在线| 欧美精品激情视频 | 岛国色图 | 成人自拍视频在线观看 | 免费黄色短片 | 欧美性猛交xxx乱大交3 | 九九精品久久 | 狠狠激情 | 天天操天天操天天操天天操天天操 | 男人天堂影院 | 亚洲涩涩网 | 国产视频在线观看一区 | 日韩无码专区 | 黄色三级av | 官场艳妇疯狂性关系 | 国产精品免费久久久久 | 黄色大片91 | 日韩欧美aⅴ综合网站发布 国产成人一区二区三区小说 | 国产麻豆91视频 | 日韩精品视频在线播放 | 高清国产在线观看 | 黄色片网站在线播放 | 黄色小视频国产 | 97精品国产97久久久久久春色 | 色戒在线免费 | 91麻豆精品国产91久久久久久 | 亚洲av永久无码精品三区在线 | 四虎国产精品永久在线国在线 | 久久久久久在线观看 | 国产aⅴ无码片毛片一级一区2 | 精品熟妇无码av免费久久 | 伊人tv| 91美女免费看 | 在线观看免费视频国产 | 国产a三级 | 国产精品无 | 久久久久人妻精品一区二区三区 | 中文在线а√在线8 | 欧美va亚洲va | 在线看网站 | 欧美三日本三级少妇三 | 中文字幕日韩亚洲 | 午夜99| av首页在线观看 | www.成人| 美女网站黄页 | 91av在| 国产一级一片 | 女女同性高清片免费看 | 欧美熟妇精品黑人巨大一二三区 | a级免费毛片 | 国产老女人精品毛片久久 | 九草视频在线 | 欧美日韩视频免费 | free性娇小hd第一次 | 久久久久久电影 | 精品一区二区三区在线免费观看 | av操操操 | 人人妻人人藻人人爽欧美一区 | 毛片毛片毛片毛片毛片 | 影音先锋在线中文字幕 | 四虎最新站名点击进入 | 国产一区中文字幕 | 91精品国产91久久久久青草 | 香蕉色视频 | 夜夜夜撸 | 色九九视频 | 最近高清中文在线字幕在线观看 | 色之久久综合 | 可以免费观看的毛片 | 午夜色大片 | 国产尤物精品 | 国产美女极度色诱视频www | 国产电影免费观看高清完整版视频 | 黄色亚洲视频 | 清纯唯美第一页 | 天堂中文资源在线观看 | 国产精品午夜在线观看 | 亚洲自拍偷拍网站 | 欧美人和黑人牲交网站上线 | 色呦呦麻豆 | 嫩草影院永久入口 | 男生操女生屁股 | 天天艹av | 高清一区二区三区四区五区 | 一级不卡毛片 |