先介绍几个常用关键字:

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

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

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

Extentions

extensions 声明一个消息中的一定范围的field的顺序数字用于进行扩展。其它人可以在自己的.proto文件中重新定义这些消息field,而不需要去修改原始的.proto文件

message Foo {

// .....

extensions 100 to 199;

}

这些说明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;
}

ProtocolBuffers-3 For Objective C (2)-进阶的更多相关文章

  1. AFNetworking 3.0 源码解读 总结(干货)(下)

    承接上一篇AFNetworking 3.0 源码解读 总结(干货)(上) 21.网络服务类型NSURLRequestNetworkServiceType 示例代码: typedef NS_ENUM(N ...

  2. AFNetworking 3.0 源码解读(五)之 AFURLSessionManager

    本篇是AFNetworking 3.0 源码解读的第五篇了. AFNetworking 3.0 源码解读(一)之 AFNetworkReachabilityManager AFNetworking 3 ...

  3. Automake

    Automake是用来根据Makefile.am生成Makefile.in的工具 标准Makefile目标 'make all' Build programs, libraries, document ...

  4. Objective-c——UI进阶开发第一天(UIPickerView和UIDatePicker)

    一.知识点 1.介绍数据选择控件UIPickerView和日期选择控件UIDatePicker控件 * UIPickerView的案例 * 点餐系统 * 城市选择 * 国旗选择 * UIDatePic ...

  5. Httpd服务进阶知识-LAMP源码编译安装

    Httpd服务进阶知识-LAMP源码编译安装 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 想必大家都知道,动态资源交给fastcgi程序处理,静态资源依旧由httpd服务器处理  ...

  6. nodejs进阶(6)—连接MySQL数据库

    1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...

  7. nodejs进阶(4)—读取图片到页面

    我们先实现从指定路径读取图片然后输出到页面的功能. 先准备一张图片imgs/dog.jpg. file.js里面继续添加readImg方法,在这里注意读写的时候都需要声明'binary'.(file. ...

  8. JavaScript进阶之路(一)初学者的开始

    一:写在前面的问题和话 一个javascript初学者的进阶之路! 背景:3年后端(ASP.NET)工作经验,javascript水平一般般,前端水平一般般.学习资料:犀牛书. 如有误导,或者错误的地 ...

  9. nodejs进阶(3)—路由处理

    1. url.parse(url)解析 该方法将一个URL字符串转换成对象并返回. url.parse(urlStr, [parseQueryString], [slashesDenoteHost]) ...

随机推荐

  1. Javascript数值转换(string,int,json)

    数值: 在JavaScript中,数值转换一般有三种方式: 一.Number(param)函数:param可以用于任何数据类型 1.1 param是Boolean值,true和false分别转换为1和 ...

  2. jquery toastr弹窗的代码和使用

    <link href="toastr.css" rel="stylesheet" type="text/css" /> < ...

  3. web网页中使用vlc插件播放相机rtsp流视频

    可参考: 使用vlc播放器做rtsp服务器 使用vlc播放器播放rtsp视频 使用vlc进行二次开发做自己的播放器 vlc功能还是很强大的,有很多的现成的二次开发接口,不需配置太多即可轻松做客户端播放 ...

  4. php事务

    <?php set_time_limit(); function sel($time,$number,$count){ ){ sel($time,$number,$count); return ...

  5. JavaScript 秘密花园 学习心得

    目的 记录一下学习心得,便于以后复习,内容是比较基础的...但是很多内容我还是不知道... 对象 对象使用和属性 1.JavaScript 中所有变量都可以当作对象使用,除了两个例外 null和dun ...

  6. 使用powershell批量添加Keil和IAR的头文件路径

    在Keil和IAR的工程中,为了使文件结构清晰,通常会设置很多的子文件夹,然后将头文件和源文件放在不同的子文件夹中,这样就需要手动添加这些头文件夹的路径.当工程结构非常复杂时,文件夹的数量就非常多,特 ...

  7. SQL Server 2016 RC0 安装(超多图)

    微软最新版本的数据库SQL Server 2016在2016年3月9日推出了RC0版本.已经提供了包括简体中文等多种语言版本,不过联机丛书还是英文版的.对OS的要求是WIN8,WIN10, WIN20 ...

  8. VirtualBox COM对象获取失败

    问题描述: Failed to instantiate CLSID_VirtualBox w/ IVirtualBox, but CLSID_VirtualBox w/ IUnknown works. ...

  9. 小小C程序(九九乘法表)

    用一个简单的嵌套循环实现: #include <stdio.h> int main() { int i,j; ,j=i;i<=&&j<=;) { if (i== ...

  10. runtime 第四部分method swizzling

    接上一篇 http://www.cnblogs.com/ddavidXu/p/5924597.html 转载来源http://www.jianshu.com/p/6b905584f536 http:/ ...