Proto编码 Tips

Proto编码 Tips

  • 每个消息字段定义都有唯一的编号。这些编号用于标记字段在消息字节中的位置。并且在消息中不应更改。更改后会影响接收者消息的位置。
  • 范围1 - 15 需要一个字节进行编码,所以效率最高。常用字段使用1 - 15进行编码。
  • 范围16 - 2047 需要二个字节进行编码。
  • 可以指定的最小字段编号为1,最大字段编号为229-1 或 536,870,911。也不能使用数字 19000 到
    19999(FieldDescriptor :: kFirstReservedNumber 到 FieldDescriptor ::
    kLastReservedNumber),因为它们是为 Protocol Buffers实现保留的。
  • 尽量控制编码大小,不要出现超大的消息结构。
  • reserved用户定义保留编号,或者保留节点。

字段规则Tips

  • 字段名不能重复,必须唯一。
  • repeated type fieldname 在字段前面加,定义一个类型数组
  • 在 proto3 中,纯数字类型的 repeated 字段编码时候默认采用 packed 编码

常规类型

主要编码方式是Base 128 Varints 编码。主要是根据数据长度,确定字节的大小。
下面是各个语言的数据类型的对照表
在这里插入图片描述

map 类型

  • map类型用来表示字典类型。
  • map 是不能用 repeated 修饰的。
  • 线性数组和 map 迭代顺序的是不确定的,所以你不能依靠你的 map 是在一个特定的顺序。
  • 为 .proto 生成文本格式时,map 按 key 排序。数字的 key 按数字排序。
  • 从数组中解析或合并时,如果有重复的 key,则使用所看到的最后一个 key(覆盖原则)。从文本格式解析映射时,如果有重复的 key,解析可能会失败。

枚举

在message 中可以嵌入枚举类型

  string query = 1;
  int32 page_number = 2;
  int32 result_per_page = 3;
  enum Corpus {
    UNIVERSAL = 0;
    WEB = 1;
    IMAGES = 2;
    LOCAL = 3;
    NEWS = 4;
    PRODUCTS = 5;
    VIDEO = 6;
  }
  Corpus corpus = 4;
}

枚举类型需要注意的是,一定要有 0 值。

  • 枚举为 0 的是作为零值,当不赋值的时候,就会是零值。
  • 为了和 proto2 兼容。在 proto2 中,零值必须是第一个值。

JSON Mapping

Proto3 支持 JSON 中的规范编码,使系统之间共享数据变得更加容易。编码在下表中按类型逐个描述。
在这里插入图片描述

命名规范

message 采用驼峰命名法。message 首字母大写开头。字段名采用下划线分隔法命名。

message SongServerRequest {
   required string song_name = 1;
}

猜你喜欢

转载自blog.csdn.net/qq_35554975/article/details/86704586