protocol buffer相关
protocol buffer簡介
????protocol buffer全稱Google Protocol Buffers,是google開發的一套用于數據存儲,網絡通信的協議編解碼的工具庫,與XML或者JSON相差不多,即把某種數據結構的信息,以某種格式(XML,JSON)保存起來,但是protobuf與XML和JSON不同在于,protobuf是基于二進制的。與XML和JSON的性能相別則是不言而喻的。 關于相關的性能對比可以看這里。
protocol buffer版本比較
Protobuf目前為止有兩個版本,proto2和proto3,proto3與proto2相比支持更多語言,更加簡介,去掉了一些復雜的語法與特性,,更強調約定而弱化語法。
- 在第一行非空白非注釋行寫入syntax = "proto3";則表明此protobuf文件為proto3版本,如果不寫入,或者寫入syntax="proto2";則表示此protobuf文件為proto2版本;
- 字段規則移除了"required",并把"optional"改名為 "singular", 在 proto2 中required是不推薦使用的,proto3則直接從語法層面上移除了required規則;
- 移除了default選項,在proto2中,可用default選項為某一字段指定默認值,而在proto3中,字段的默認值只能根據字段類型由系統決定;
- 移除了對擴展的支持,新增了 Any 類型;
Proto2語法格式
如下proto文件
syntax = "proto2";
package msg;
?
message CS_PlayerLogin{
????required string account=1;
????required string pwd=2;
}
message SC_PlayerLogin{
????//0成功 1賬號錯誤 2密碼錯誤
????required sint32 result=1;
????required uint64 playerId=2;
- syntax = "proto2";對應的proto版本;
- package msg;對應的包名;
- message:定義消息類型;消息中的每個字段可有三個選項(required,optional,repeated)
- required:必填字段;
- optional:選填字段,不填就會使用默認值,默認數值類型的默認值為0,string類型為空字符串,枚舉類型為第一個枚舉值;
- repeated:數組類型,可以放入多個類型實例。
之后再跟上數據類型,數據類型之后為字段名字,最后再跟上"=N",此處N是標志位,每個字段都有標志位,各個標志位不能重復且為正整數,其最大值為 2^29 - 1,同時protobuf內部預留了19000到19999不能被用戶使用,官方建議將常用的字段放在前面,由于這個字段的大小隨著數值大小增加,如1-16只占用一個字節(推薦消息字段個數不多余16個)。最后可以跟上自定義的默認值。
- 在一個proto文件中可以存放多個message,message內部也可以定義message,外部如需調用需要指明對應的層級關系。同時可以使用import引入外部的proto文件:
import "person.proto";
//引入外部proto文件,并讓引入了該文件的proto文件也能訪問被引入類型。
import public "person.proto";
protocol buffer基本數據類型
protocol buffer的常用基礎數據類型:
數據類型 | 描述 | 字節個數 | C#語言映射 |
bool | 布爾類型 | 1 | bool |
double | 64位浮點數 | N | double |
float | 32為浮點數 | N | float |
int32 | 32位整數 | N | int |
uin32 | 無符號32位整數 | N | uint |
int64 | 64位整數 | N | long |
uint64 | 64為無符號整 | N | ulong |
sint32 | 32位整數,處理負數效率更高 | N | int |
sing64 | 64位整數 處理負數效率更高 | N | long |
fixed32 | 32位無符號整數 | 4 | uint |
fixed64 | 64位無符號整數 | 8 | ulong |
sfixed32 | 32位整數、能以更高的效率處理負數 | 4 | uint |
sfixed64 | 64為整數 | 8 | ulong |
string | 只能處理 ASCII字符 | N | string |
bytes | 用于處理多字節的語言字符、如中文 | N | string |
enum | 可以包含一個用戶自定義的枚舉類型uint32 | N(uint32) | enum |
message | 可以包含一個用戶自定義的消息類型 | N | object of class |
map | 鍵值對,鍵可使用string或數值類型 | N | Dictionary |
- N表示打包的字節個數并不固定,取決于數據的大小;
轉載于:https://www.cnblogs.com/Yellow0-0River/p/8387729.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的protocol buffer相关的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WebSocket教程(一)
- 下一篇: Openstack入门篇(十一)之neu