ProtocolBuffers-3 For Objective C (2)-进阶
先介绍几个常用关键字:
equired前缀表示该字段为必要字段,既在序列化和反序列化之前该字段必须已经被赋值。与此同时,在Protocol Buffer中还存在另外两个类似的关键字,optional和repeated,带有这两种限定符的消息字段则没有required字段这样的限制。相比于optional,repeated主要用于表示数组字段
标签数字1和2、3则表示不同的字段在序列化后的二进制数据中的布局位置
对于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)-进阶的更多相关文章
- AFNetworking 3.0 源码解读 总结(干货)(下)
承接上一篇AFNetworking 3.0 源码解读 总结(干货)(上) 21.网络服务类型NSURLRequestNetworkServiceType 示例代码: typedef NS_ENUM(N ...
- AFNetworking 3.0 源码解读(五)之 AFURLSessionManager
本篇是AFNetworking 3.0 源码解读的第五篇了. AFNetworking 3.0 源码解读(一)之 AFNetworkReachabilityManager AFNetworking 3 ...
- Automake
Automake是用来根据Makefile.am生成Makefile.in的工具 标准Makefile目标 'make all' Build programs, libraries, document ...
- Objective-c——UI进阶开发第一天(UIPickerView和UIDatePicker)
一.知识点 1.介绍数据选择控件UIPickerView和日期选择控件UIDatePicker控件 * UIPickerView的案例 * 点餐系统 * 城市选择 * 国旗选择 * UIDatePic ...
- Httpd服务进阶知识-LAMP源码编译安装
Httpd服务进阶知识-LAMP源码编译安装 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 想必大家都知道,动态资源交给fastcgi程序处理,静态资源依旧由httpd服务器处理 ...
- nodejs进阶(6)—连接MySQL数据库
1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...
- nodejs进阶(4)—读取图片到页面
我们先实现从指定路径读取图片然后输出到页面的功能. 先准备一张图片imgs/dog.jpg. file.js里面继续添加readImg方法,在这里注意读写的时候都需要声明'binary'.(file. ...
- JavaScript进阶之路(一)初学者的开始
一:写在前面的问题和话 一个javascript初学者的进阶之路! 背景:3年后端(ASP.NET)工作经验,javascript水平一般般,前端水平一般般.学习资料:犀牛书. 如有误导,或者错误的地 ...
- nodejs进阶(3)—路由处理
1. url.parse(url)解析 该方法将一个URL字符串转换成对象并返回. url.parse(urlStr, [parseQueryString], [slashesDenoteHost]) ...
随机推荐
- 如何查看mysql数据库的端口
启动,并进入mysql后,输入命令:show global variables like 'port'; 如下图所示.
- JS控制,返回上一页之后强行刷新一次
网站建设过程中,提交页面后我们经常要用到window.history.go(-1)返回上一页,因为页面的缓存功能,我们只能返回上次操作的页面,但在删除等操作中,我们希望实时看到删除项目后的页面,这就要 ...
- vim简单使用
摘自:http://blog.csdn.net/niushuai666/article/details/7275406 一.安装vim sudo apt-get install vim 二 ...
- 脚手架搭建的vue项目里引入jquery和bootstrap
引入jquery: 1.在cmd输入:npm install jquery,回车,等待.. 2.在webpack.base.conf.js里进行如下操作: 3.在webpack.prod.conf.j ...
- Xcode 生成静态库相关设置:
Xcode 生成静态库相关设置: #Build Setting1. Architectures ------- Architectures -----> $(ARCHS_STANDARD) -- ...
- Django基础,Day5 - form表单投票详解
投票URL polls/urls.py: # ex: /polls/5/vote/ url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, ...
- MTK MT33xx型GPS的NMEA协议解析实例
1)解析实现 gps_main.c #include <nmea/nmea.h> #include <string.h> #include <stdio.h> #i ...
- Sybase 常用SQL
http://blog.chinaunix.net/uid-200142-id-3073894.html ===========================使用总结================ ...
- js 查找树节点 数组去重
//查找树节点function findData(curOrg, id) { var array = []; if ((typeof curOrg == 'object') && (c ...
- VBA笔记(四)——立即窗口的使用
开启立即窗口 方法一:视图-立即窗口 方法二:组合键<Ctrl+G> Debug.Print 可以在立即窗口打印输出