淺析Protobuf數據格式

淺析Protobuf數據格式





Protobuf是Google開源的一款類似於Json,XML數據交換格式,其內部數據是純二進制格式,不依賴於語言和平臺,具有簡單,數據

量小,快速等優點. 目前用於序列化於反序列化官方支持的語言有C++,C#,JAVA,PYTHON. 適用於大小在1M以內的數據,因爲像

在移動設備平臺,內存是非常珍貴的.

使用的方法也比較簡單:

1.定義用於消息文件.proto

2.使用protobuf的編譯器編譯消息文件

3.使用編譯好對應語言的類文件進行消息的序列化於反序列化


Protobuf消息定義


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

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

1.限定修飾符包括 required\optional\repeated

Required:表示是一個必須字段,必須相對於發送方,在發送消息之前必須設置該字段的值,對於接收方,必須能夠識別該字段

意思.發送之前沒有設置required字段或者無法識別required字段都會引發編解碼異常,導致消息被丟棄.

Optional:表示是一個可選字段,可選對於發送方,在發送消息時可以有選擇性的設置或者不設置該字段的值. 對於接收方,如

能夠識別可選字段就進行相應處理,如果無法識別,則忽略該字段,消息中的其他字段正常處理. --因爲optional字段的特性

,很多接口在升級版本中都把後來添加的字段都統一的設置爲optional字段,這樣老的版本無需升級程序也可以正常通信,只不

過不能享受補丁內容罷了.

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

2.數據類型

Protobuf定義了一套基本數據類型,幾乎都可以映射到C++/JAVA等語言的劇本


3.字段名稱

字段名稱的命名與C/C++,java等語言的變量命名方式幾乎相同的.

protobuf建議字段的命名採用以下劃線分割的駝峯式first_name, 而不是firstName.

4.字段編碼值

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

編碼值的取值範圍爲1~2^32,其中1~15的編碼時間和空間效率都是最高的,編碼值越大,其編碼的時間和空間效率就越低,當然

一般情況下相鄰的2個值編碼效率是相同的,除非兩個值恰好是在4字節,12字節的臨界區,比如15和16.

5.默認值

當在傳輸數據的時候,對於required數據類型,如果用戶沒有設置值,則使用默認值傳遞到對端. 當接收數據是對於optional字

段,如果沒有接收到optional字段,則設置爲默認值.

關於import protobuf接口文件可以像C語言的h文件一個,分離爲多個,再需要的時候通過import導入需要對文件. 其行爲和C語

言的#include大致相同.


關於package

避免名稱衝突,可以給每一個文件指定一個package名稱,對於C++則解析爲名稱空間.

關於message

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

關於enum

枚舉的定義和C++相同,但是有一些限制. 枚舉值必須大於等於0的整數. 使用分號(;)分隔枚舉變量而不是C++語言中的逗號(,)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章