Google Protobuf 使用介紹

直接在?www.google.com.hk?上搜索google protobuf 后下載官方版本。

官方版本支持C++\Java\Python三門語言。

還有很多非官方的語言版本支持,如C\NET(C#/Vb.net)\Flex(AS3)等.

?

要通信,必須有協議,否則雙方無法理解對方的碼流。在protobuf中,協議是由一系列的消息組成的。因此最重要的就是定義通信時使用到的消息格式。

?

Protobuf消息定義

消息由至少一個字段組合而成,類似于C語言中的結構。每個字段都有一定的格式。

字段格式:限定修飾符① | 數據類型② | 字段名稱③ | = | 字段編碼值④ | [字段默認值⑤]

①.限定修飾符包含 required\optional\repeated

?

Required: 表示是一個必須字段,必須相對于發送方,在發送消息之前必須設置該字段的值,對于接收方,必須能夠識別該字段的意思。發送之前沒有設置required字段或者無法識別required字段都會引發編解碼異常,導致消息被丟棄。

Optional:表示是一個可選字段,可選對于發送方,在發送消息時,可以有選擇性的設置或者不設置該字段的值。對于接收方,如果能夠識別可選字段就進行相應的處理,如果無法識別,則忽略該字段,消息中的其它字段正常處理。---因為optional字段的特性,很多接口在升級版本中都把后來添加的字段都統一的設置為optional字段,這樣老的版本無需升級程序也可以正常的與新的軟件進行通信,只不過新的字段無法識別而已,因為并不是每個節點都需要新的功能,因此可以做到按需升級和平滑過渡。

Repeated:表示該字段可以包含0~N個元素。其特性和optional一樣,但是每一次可以包含多個值。可以看作是在傳遞一個數組的值。

②.數據類型

?

Protobuf定義了一套基本數據類型。幾乎都可以映射到C++\Java等語言的基礎數據類型.

??????

protobuf 數據類型

描述

打包

C++語言映射

bool

布爾類型

1字節

bool

double

64位浮點數

N

double

float

32為浮點數

N

float

int32

32位整數、

N

int

uin32

無符號32位整數

N

unsigned int

int64

64位整數

N

__int64

uint64

64為無符號整

N

unsigned __int64

sint32

32位整數,處理負數效率更高

N

int32

sing64

64位整數 處理負數效率更高

N

__int64

fixed32

32位無符號整數

4

unsigned int32

fixed64

64位無符號整數

8

unsigned __int64

sfixed32

32位整數、能以更高的效率處理負數

4

unsigned int32

sfixed64

64為整數

8

unsigned __int64

string

只能處理 ASCII字符

N

std::string

bytes

用于處理多字節的語言字符、如中文

N

std::string

enum

可以包含一個用戶自定義的枚舉類型uint32

N(uint32)

enum

message

可以包含一個用戶自定義的消息類型

N

object of class


N 表示打包的字節并不是固定。而是根據數據的大小或者長度。

例如int32,如果數值比較小,在0~127時,使用一個字節打包。

關于枚舉的打包方式和uint32相同。

關于message,類似于C語言中的結構包含另外一個結構作為數據成員一樣。

關于 fixed32 和int32的區別。fixed32的打包效率比int32的效率高,但是使用的空間一般比int32多。因此一個屬于時間效率高,一個屬于空間效率高。根據項目的實際情況,一般選擇fixed32,如果遇到對傳輸數據量要求比較苛刻的環境,可以選擇int32.

③.字段名稱

?

字段名稱的命名與C、C++、Java等語言的變量命名方式幾乎是相同的。

protobuf建議字段的命名采用以下劃線分割的駝峰式。例如 first_name 而不是firstName.

④.字段編碼值

有了該值,通信雙方才能互相識別對方的字段。當然相同的編碼值,其限定修飾符和數據類型必須相同。

編碼值的取值范圍為 1~2^32(4294967296)。

其中 1~15的編碼時間和空間效率都是最高的,編碼值越大,其編碼的時間和空間效率就越低(相對于1-15),當然一般情況下相鄰的2個值編碼效率的是相同的,除非2個值恰好實在4字節,12字節,20字節等的臨界區。比如15和16.

1900~2000編碼值為Google protobuf 系統內部保留值,建議不要在自己的項目中使用。

protobuf 還建議把經常要傳遞的值把其字段編碼設置為1-15之間的值。

消息中的字段的編碼值無需連續,只要是合法的,并且不能在同一個消息中有字段包含相同的編碼值。

建議:項目投入運營以后涉及到版本升級時的新增消息字段全部使用optional或者repeated,盡量不實用required。如果使用了required,需要全網統一升級,如果使用optional或者repeated可以平滑升級。

?

⑤.默認值。當在傳遞數據時,對于required數據類型,如果用戶沒有設置值,則使用默認值傳遞到對端。當接受數據是,對于optional字段,如果沒有接收到optional字段,則設置為默認值。

關于import

protobuf 接口文件可以像C語言的h文件一個,分離為多個,在需要的時候通過 import導入需要對文件。其行為和C語言的#include或者java的import的行為大致相同。

關于package

避免名稱沖突,可以給每個文件指定一個package名稱,對于java解析為java中的包。對于C++則解析為名稱空間。

?

關于message

支持嵌套消息,消息可以包含另一個消息作為其字段。也可以在消息內定義一個新的消息。

關于enum

枚舉的定義和C++相同,但是有一些限制。

枚舉值必須大于等于0的整數。

使用分號(;)分隔枚舉變量而不是C++語言中的逗號(,)

eg.

enum VoipProtocol?

{

??? H323 = 1;

??? SIP? = 2;

??? MGCP = 3;

??? H248 = 4;

}


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/444803.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/444803.shtml
英文地址,請注明出處:http://en.pswp.cn/news/444803.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

epoll的再次認識

使用mmap加速內核與用戶空間的消息傳遞。 這 點實際上涉及到epoll的具體實現了。無論是select,poll還是epoll都需要內核把FD消息通知給用戶空間,如何避免不必要的內存拷貝就很 重要,在這點上,epoll是通過內核于用戶空間mmap同一塊內存實現的。而如果你想我一樣從2.5內核就關…

leetcode82. 刪除排序鏈表中的重復元素 II

給定一個排序鏈表,刪除所有含有重復數字的節點,只保留原始鏈表中 沒有重復出現 的數字。 示例 1: 輸入: 1->2->3->3->4->4->5 輸出: 1->2->5 示例 2: 輸入: 1->1->1->2->3 輸出: 2->3 思路:判斷n…

C++(16)--運算符重載(自定義Integer類)

運算符重載1.運算符重載--重點2.友元函數--難點(流運算符重載)《老九學堂C課程》《C primer》學習筆記。《老九學堂C課程》詳情請到B站搜索《老九零基礎學編程C入門》 -------------簡單的事情重復做,重復的事情用心做,用心的事情堅持做(老九君)--------…

反應器組件 ACE_Reactor

6.1 反應器組件 ACE_Reactor反應器的基本原理是: 針對關心的某個事件寫一個事件處理器(event_handler). 將該事件處理器登記到反應器中(同時指明關心的事件). 然后反應器會自動檢測事件的發生. 并調用預先登記的事件處理器中的回調函數. 所以ACE Reactor 框架的責任&#x…

C++(17)--詳解const

詳解const《老九學堂C課程》《C primer》學習筆記。《老九學堂C課程》詳情請到B站搜索《老九零基礎學編程C入門》-------------簡單的事情重復做,重復的事情用心做,用心的事情堅持做(老九君)---------------1.const修飾成員變量 2.const修飾函數參數 3.c…

cppcheck的安裝和使用

首先從這里下載linux版本的:http://sourceforge.net/projects/cppcheck/files/cppcheck/ 然后下載對應的版本,解壓,之后安裝: 編譯: g++ -o cppcheck -Ilib cli/*.cpp lib/*.cpp 安裝: make install

leetcode24 兩兩交換鏈表中的節點

給定一個鏈表,兩兩交換其中相鄰的節點,并返回交換后的鏈表。 你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。 示例: 給定 1->2->3->4, 你應該返回 2->1->4->3. 思路:這一看就是個遞歸定義&…

再議指針和引用的一些事情吧

關于指針和引用一直是學習C++的同學們爭論的焦點,什么時候用指針,什么時候用引用,還有怎么引用數組,這么用指針訪問數組,以及初始化的問題。 不過有一些文章我在很早就已經寫過,但是由于當時時間不充分,自己也都是隨性寫的,可以參看以前我的一個文章:http://blog.csd…

C++(18)--復制構造函數

復制構造函數《老九學堂C課程》《C primer》學習筆記。《老九學堂C課程》詳情請到B站搜索《老九零基礎學編程C入門》-------------簡單的事情重復做,重復的事情用心做,用心的事情堅持做(老九君)---------------包裝基本類,封裝一些算法。 需求…

lua與C++粘合層框架

一. lua調用C 在lua中是以函數指針的形式調用函數, 并且所有的函數指針都必須滿足如下此種類型: typedef int (*lua_CFunction) (lua_State *L);   也就是說, 偶們在C中定義函數時必須以lua_State為參數, 以int為返回值才能被Lua所調用. 但是不要忘記了, 偶們的lua_State是…

leetcode147 對鏈表進行插入排序

丟人,我就是按插入排序老老實實寫的啊。。。。 別人肯定map了hhh。 對鏈表進行插入排序。 插入排序的動畫演示如上。從第一個元素開始,該鏈表可以被認為已經部分排序(用黑色表示)。 每次迭代時,從輸入數據中移除一個…

PaperNotes(13)-Conditional Image Generation with PixelCNN Decoders

conditional Image generation with PixelCNN DecodersICML的best paperpixel cnn 屬于完全可見的信念網絡,需要對 概率密度 建模。給定圖像數據x,想要對概率分布p(x)建模。概率分布p(x)可以看做,每一像素分布同時作用結果的一個聯合分布。一…

Expression : invalid operator 解決方法

從技術上說,用于排序關聯容器的比較函數必須在它們所比較的對象上定義一個“嚴格的弱序化(strict weak ordering)”。(傳給sort等算法的比較函數也有同樣的限制),就是兩個對象比大小或先后的規則,比如兩個 string對象比大小的規則…

leetcode23 合并K個排序鏈表

合并 k 個排序鏈表,返回合并后的排序鏈表。請分析和描述算法的復雜度。 示例: 輸入: [ 1->4->5, 1->3->4, 2->6 ] 輸出: 1->1->2->3->4->4->5->6 思路:把初始的每一個鏈表當成數組中的一個數,做…

Xcode LaunchImage 載入界面大小設置

iPhone Portrait iOS 8-Retina HD 5.5 (12422208) @3x iPhone Portrait iOS 8-Retina HD 4.7 (7501334) @2x iPhone Portrait iOS 7,8-2x (640960) @2x iPhone Portrait iOS 7,8-Retina 4 (6401136) @2x iPhone Portrait iOS 5,6-1x (320480) @1x iPhone Portrait iO…

leetcode237 刪除鏈表中的節點(你意想不到的做法,注意細節)

請編寫一個函數,使其可以刪除某個鏈表中給定的(非末尾)節點,你將只被給定要求被刪除的節點。 現有一個鏈表 -- head [4,5,1,9],它可以表示為: 示例 1: 輸入: head [4,5,1,9], node 5 輸出: [4,1,9] 解釋: 給定你鏈…

cppcheck值得注意的一些篩選項

使用完cppcheck進行C代碼檢測之后,可能篩選起來很麻煩,一般常見的優化有 emptiness,就是當你使用stl的時候,最好用empty替代size 還有就是 leak

C++(19)--自定義Array,vector練習

自定義Array,vector1.自定義Array2.自定義vector《老九學堂C課程》《C primer》學習筆記。《老九學堂C課程》詳情請到B站搜索《老九零基礎學編程C入門》-------------簡單的事情重復做,重復的事情用心做,用心的事情堅持做(老九君)---------------1.自定義…

讓cocos2dx支持并通過arm64 編譯

為了要支持64位,請把這個文件直接替換到對應的lib目錄下,本來是需要改neton_matrix_impl.c里的宏定義, 在 platform/ios/EAGLVIEW.mm中 在neon_matrix_impl.c中修改 #if defined(__ARM_NEON__) 為#if defined(_ARM_ARCH_7) 還有 third_party目錄下的curl的支持。

springboot——概述

Spring Boot 介紹 Spring Boot 是由 Pivotal 團隊提供的全新框架,其設計?的是?來簡化新 Spring 應? 初始搭建以及開發過 程,該框架使?了特定的?式來進?配置,從?使開發?員不再需要定義樣板化的配置。 默認配置了很多框架的使??式…