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

定义一个基本消息类型

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值