Protocol-Buffers(PB协议)学习笔记

717 阅读3分钟

「这是我参与2022首次更文挑战的第14天,活动详情查看:2022首次更文挑战

什么是PB

PB 是一种与语言无关,平台无关的一种通信协议,类似于XML和JSON。但是他又不同于XML、JSON等结构化文本数据格式,PB 是一种二进制的数据格式,因此具有更高的传输、打包和解包效率。

PB 与 XML 和 JSON 的区别

PB的优势

与XML相比:

  • 更简单
  • 小3-10倍
  • 快20-100倍
  • 更少的歧义
  • 可以方便的生成数据存取类

PB的语法

PB都是保存为*.proto的文件中的

示例文件:

// 包声明,防止不同message类型的名字冲突
package web;

message User{
	required int32 id = 1;
  optional string name = 2;
  enum PhoneType {
        MOBILE = 0;
        HOME = 1;
        WORK = 2;
    }
  message PhoneNumber{
  	required string number;
    optional PhoneType type = 2 [ default = HOME ];
  }
}

数据类型

标准类型

.protoC++介绍
doubledouble
floatfloat
int32int32变长编码,对负数效率不高
int64int64
uint32uint32
uint64uint64
sint32int32变长编码,对负数效率较高
sint64int64
fixed32uint32固定4byte,如果数值经常大于2^28的话,效率高于uint32
fixed64uint64固定8byte,如果数值经常大于2^56的话,效率高于uint64
sfixed32int32
sfixed64int64
boolbool
stringstringUTF-8编码或者7-ASCII编码
bytesstring任意二进制数据

复合类型

enum——枚举类型

  1. 枚举值必须大于等于0的整数
  2. 枚举内部的编号不允许重复
  1. 使用分号(;)分隔枚举变量,而不是C++语言中的逗号(,)
  2. 第一个编号必须为0(proto3 中)
enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
}

message类型

message PhoneNumber {
    required string number = 1;
    optional PhoneType type = 2 [ default = HOME ];
}

message 类型可以作为数据类型,即一个message 可以包含另一个message 作为字段

支持message 内嵌套 message

字段

字段格式:限定修饰符 数据类型 字段名称 = 字段编号 [字段默认值]

限定修饰符

  • required 表示一个必须字段
  • optional 表示一个可选字段
  • repeated 表示该字段可以包含0~N个元素

字段名称

建议使用下划线进行分割而不是驼峰,如my_name,而不是myName

字段编号

  1. 字段必须有编号,有了编号,通信双方才能互相识别对方的字段
  2. 编号不允许重复
  1. 编号无需连续
  2. 编号的取值范围为 12^32(4294967296)。其中 115的编码时间和空间效率都是最高的,编号越大,其编码的时间和空间效率就越低(相对于1-15)
  1. 1900~2000编码值为内部保留值,建议不要在项目中使用
  2. 建议把要经常传递的值的字段编号设置为1-15之间的值

默认值

  1. 使用 default 选项为某一字段指定默认值
  2. proto3中移除了 default 选项。

若有收获,就点个赞吧