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表示打包的字节个数并不固定,取决于数据的大小;