Protocol Buffer 消息定义

概念

protobuf 是 Google 公司提出的一种轻便高效的结构化数据存储格式,常用于结构化数据的序列化,具有语言无关、平台无关、可扩展性特性,常用于通讯协议、服务端数据交换场景

支持的类型

  • 数值型
    • int32, uint32, sint32, fixed32, sfixed32
    • int64, uint64, sint64, fixed64, sfixed64
    • float, double
    • 默认值:0
  • 布尔型
    • true
    • false
  • 字符型
    • string, 长度不可超过 232,且需是 UTF-8 编码
    • 默认值:空字符串
  • 字节型
    • bytes 可表示 byte 数组序列,长度不可超过 232
    • 默认值:空 byte 数组
  • 枚举型
    • enum,第一个值必须是 0
    • 默认值:0,枚举里定义的第一个枚举值

Tag

在 proto 文件中,tag 比较重要,用来标识字段的唯一性

数值范围:1 - 2^29-1

其中 19000 - 19999 之间的数是保留数,不可用

其中 1 - 15 只占用一个字节,应该用在频繁使用的字段上;16 - 2047 占用两个字节,可以用在不频繁使用的字段上

tag 只能出现 0 或 1 次,这是 proto3 的默认规则

关键词

  • syntax 声明 proto 文件的语言版本
  • option 定义 proto 或者 生成的代码的相关属性,如设置枚举可定义别名,命名空间
    • option allow_alias = true;
    • option csharp_namespace = 'xxx';
  • package proto 文件里面的 namespace
  • import 导入已定义的 proto 类型
  • message 定义一个消息
  • service 定义一个服务
  • repeated 定义数组
  • reserved 标记删除的 tag 或 字段名
    • reserved 10, 15 to 20, 100 to max;
    • reserved 'field1', 'field2';

注释

  • // 这行文字被注释了
  • /* 这里的文字被注释了 */

示例

message School {
    int32 id = 1;
    string name = 2;
    float size = 3;
    bytes image = 4;
    // int64 number = 5;
    bool is_important = 6;
    ClassType classType = 7;
    Date build_date = 8;

    reserved 5;
    reserved 'number';

    enum ClassType {
        option allow_alias = true;

        NOT_SPECIFIED = 0;
        LARGE = 1;
        SMALL = 2;

        BIG = 1;
    }
}

message Date {
    int32 year = 1;
    int32 month = 2;
    int32 day = 3;
}
posted @ 2022-11-13 15:57  liujiangbo  阅读(96)  评论(0编辑  收藏  举报