protobuf解析(一)

protobuf是一种新的消息或数据结构体的定义模式。我们来看下基本写法:
1. 基本数据类型:包括double、float、bool、string、bytes、int32、int64、uint32、uint64、sint32、sint64、fixed32、fixed64、sfixed32、sfixed64;
2. 引用其他message类型
3. 枚举类型:对于枚举类型,protobuf有个约束:枚举的第一项对应的值必须为0;下面是一个包含枚举类型的消息定义
4. import其他proto文件

import "myproject/other_protos.proto";  //引入外部proto

message Count {
    string type =1;
    int32 num =2;
}
message SearchRequest {
  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; //enum类型使用
  repeated Count counts =5; // message引用
  oneof user_identifier { // oneof使用
    string user_name = 6;
    string phone_num = 7;
    string user_email = 8;
  }
}

介绍完了基本用法,我们先岔开一下,为什么用protobuf替代json或xml呢?
答案是节省资源,protobuf用了特殊的编码方式使结构更紧凑
1. Varint编码
它用一个或多个字节来表示一个数字,值越小的数字使用越少的字节数。这能减少用来表示数字的字节数。Varint 中的每个 byte 的最高位 bit 有特殊的含义,如果该位为 1,表示后续的 byte 也是该数字的一部分,如果该位为 0,则结束。其他的 7 个 bit 都用来表示数字。对于int32的数据,小于 128 的数字只需要1字节而不是原先的4字节来传递或存储
2. ZigZag编码
这是一种将负数用小正数来mapping,因为其实我们大多数情况下都用一些小负值,用这种方法又节约了字节数。
protobuf解析(一)_第1张图片

你可能感兴趣的:(protobuf)