ProtocolBuffers-3 For Objective C (2)-进阶

 

先介绍几个经常使用关键字:数组

equired前缀表示该字段为必要字段,既在序列化和反序列化以前该字段必须已经被赋值。与此同时,在Protocol Buffer中还存在另外两个相似的关键字,optional和repeated,带有这两种限定符的消息字段则没有required字段这样的限制。相比于optional,repeated主要用于表示数组字段布局

标签数字123则表示不一样的字段在序列化后的二进制数据中的布局位置优化

对于Protocol Buffer而言,标签值为1到15的字段在编码时能够获得优化,即标签值和类型信息仅占有一个byte,标签范围是16到2047的将占有两个bytes,而Protocol Buffer能够支持的字段数量则为2的29次方减一。有鉴于此,咱们在设计消息结构时,能够尽量考虑让repeated类型的字段标签位于1到15之间,这样即可以有效的节省编码后的字节数量ui

Extentionsgoogle

extensions 声明一个消息中的必定范围的field的顺序数字用于进行扩展。其它人能够在本身的.proto文件中从新定义这些消息field,而不须要去修改原始的.proto文件编码

message Foo {scala

  // .....设计

  extensions 100 to 199;string

}io

这些说明100-199的field是保留的。其它用户能够用这些field在他们本身的.proto文件中添加新的fields给Foo。举例:

extend Foo {

  optional int32 bar = 126;

}

 

很是重要的一点是双方不能使用一样数字添加同样的message类型,这样extension会被解释为错误类型。

可能须要有一个关于field的数字顺序的约定来保证你的project不会发生这样的重复的问题。

若是你的field数字比较大的话,可使用max来指定你的textension范围上升到最大的范围

message Foo {

  extensions 1000 to max;

}

 

没有指定默认值的话,string 默认为空串,bool 默认为false,数字类型默认0,枚举类型,默认为类型定义中的第一个值

 

 

1. proto文件基础写法

syntax = "proto3"; //syntax = “proto3”:表示这是使用protobuf3的语法,不加这句默认使用protobuf2的语言

message Person { // message相似class
string name = 1; // 1 表示这个字段存储的位置
int32 id = 2; // 字段格式:限定符① | 数据类型② | 字段名称③ | = | 字段编码值④ | [字段默认值⑤]
string email = 3;
bytes image = 4; // 定义nsndata
bool isHave = 5;
map<string, string> projects = 6; // 定义字典
repeated string array = 7; // 定义数组
float numFool = 8;
double numDouble = 9;

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

// 在当前目录即可以看到Test.pbobjc.h和Test.pbobjc.m这两个文件了(须要注意的是生成的代码是MRC的,若是引入ARC工程中记得添加-fno-objc-arc的标签).

 

2.

syntax = "proto3"; //syntax = “proto3”:表示这是使用protobuf3的语法,不加这句默认使用protobuf2的语言

message Person {
string name = 1;
int32 id = 2;
PhoneNumber pp = 3; // // 能够嵌套
PhoneType type = 5; // 可使用枚举
repeated PhoneNumber phone = 4; //
}

message PhoneNumber {
string number = 1;
PhoneType type = 2 ;
}

enum PhoneType {
//enum类型必须有一个明确是0的字段,这个一是为了和protobuf2兼容,而是使其有个默认值
MOBILE = 0;
HOME = 1;
WORK = 2;
}

 

3.

syntax = "proto3"; //syntax = “proto3”:表示这是使用protobuf3的语法,不加这句默认使用protobuf2的语言

import "google/protobuf/any.proto";

message Person {
string name = 1;
int32 id = 2;
string email = 3;
repeated google.protobuf.Any details = 5; // any任何类型

}

enum EnumAllowingAlias { option allow_alias = true; // 若是想让不一样的枚举指向同一个field UNKNOWN = 0; STARTED = 1; RUNNING = 1;}

相关文章
相关标签/搜索