protobuf3 从object-c角度说明数据类型

来源:互联网 发布:大数据实验室 编辑:程序博客网 时间:2024/05/29 17:29

定义一个基本消息类型

syntax = "proto3";message SearchRequest {  string query = 1;  int32 page_number = 2;  int32 result_per_page = 3;}
  1. syntax = “proto3”:表示这是使用protobuf3的语法,不加这句默认使用protobuf2的语言.两者还是有不少差异的.
  2. message:包含一些基本数据,有点类似于C语言的结构体
  3. message的tag: filed采用key-value的方式编写.最后一个字段为唯一标识符,是用来定位filed的tag.tag的取值范围为
    229 - 1, or 536,870,911,但是不要使用19000 到 19999,这段数字苹果自己保留的,用于未来实现.

消息组成

字段格式:限定符① | 数据类型② | 字段名称③ | = | 字段编码值④ | [字段默认值⑤]

限定符: singular,repeated
singular:一个正确定义的消息包含零或者1个该field.不超过1个
repeated:可以添加多个,相当于一个数组.排列顺序就是添加时的顺序.protobuf3对scalar数字类型的repeated限定默认都是packed的,这样可以节省很多空间,共用一个key,减少了key的占用.

Scalar Value Types
对应关系

Enumations类型

enum EnumAllowingAlias {  option allow_alias = true;  UNKNOWN = 0;  STARTED = 1;  RUNNING = 1;}enum EnumNotAllowingAlias {  UNKNOWN = 0;  STARTED = 1;  // RUNNING = 1;  // Uncommenting this line will cause a compile error inside Google and a warning message outside.}
  1. enum类型必须有一个明确是0的字段,这个一是为了和protobuf2兼容,而是使其有个默认值,protobuf3所有的数据都有默认值.
  2. 数据定义必须是int32的,如果是负数则使用sint32
  3. 数值想用的可以定义alias,否则会报错.

Any类型
用来表示序列化后的byte.需要导入google/protobuf/any.proto,同时filed定义必须是全局唯一的url的命名方式.目前用于runtime的库还在开发中.

Oneof
当有一个message有很多fileds,但只有一个会被赋值时,建议使用这个.如果一个filed被赋值,其他fileds都会被清空.

Map
如果想创建关联类型,可以使用该数据格式.其中的key可以是任意的整形或字符串,value可以是任意类型.

map<string, Project> projects = 3;
  1. map类型不可以是repeted
  2. 他是无序的
  3. 当从proto文件中转换时,会如果是字符串按照key的顺序,如果是数字会按照数字的顺序.
  4. 当解析或者合并map数据时,会使用最后一个key,但是从text转换到map时,如果有重复的key,会报错

参考

1.generate oc code
2.protobuf3 language

0 0