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{ ui

    required string account=1; google

    required string pwd=2; spa

} blog

message SC_PlayerLogin{ ip

    //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表示打包的字節個數並不固定,取決於數據的大小;
相關文章
相關標籤/搜索