ProtoBuf使用背景##
- 编写解析代码,需要维护自定义的一套数据模型,工作量不小,维护陈本高;
- 服务端、iOS、Android三个平台要保持同步,牵一发动全身,沟通成本高;
- 如果使用的HTTP协议,JSON数据全部明文传输,安全系数低。
那么ProtoBuf的优势在哪里?##
- 异常处理完善。解析代码内部封装,对外以对象形式调用,不可能出现类型错误,且空指针、空值等异常情况内部处理完成,异常的值用默认值代替;
- 跨平台。服务端、iOS、Android共同维护一套协议文件,要变更数据传输格式时只需修改协议,并编译为各个平台的代码文件,最大限度地保持了多平台统一;
- 传输安全。协议最终序列化后用于传输的数据,是二进制流,无法直接查看到传输的信息和数据结构,同样使用HTTP协议的环境下安全度高于JSON;
- 存储转换算法高效。同样的UserInfo键值对数据,虽然没有官网上描述的性能那么好,但是亲测持久化文件体积是JSON的1/3,更不要说和XML相比了。编码原理有兴趣的朋友可查看。大致思路是将对象,按顺序编号和类型编号,拼接值,存储为二进制流。
- 解析算法高效。要知道,计算机跟人不同,后者肉眼识别字符串很快,但前者是很低效的,前者的强项在于二进制位操作和顺序读取数据。解析序列化数据时就不用像JSON和XML那样找成对的符号,只需按位从前往后解析数据,然后跟数据协议模型中的定义对应起来。
环境搭建##
1、 安装Command Line Tools
2、 安装Home-brew
ruby -e "$(curl -fsSL
3、 使用home-brew安装protobuf编译工具:brew install protobuf
如果要编译OC版本,则还需要安装
- brew install automake
- brew install libtool
4、ProtoBuf协议文件编译为.java模型:
protoc --java_out=/Users/xxx/Desktop/proto -I/Users/xxx/Desktop/proto /Users/xxx/Desktop/proto/marriage.proto
Android studio有默认的文件大小限制,更改配置idea.max.intellisense.filesize=2560000的值,可以放宽限制。配置文件的位置在/Applications/Android Studio.app/Contents/bin/idea.properties
protobuf-master/src/protoc --objc_out="模型文件导出目录" -I "协议文件导入目录" "协议文件导入目录"/test.proto
最后,导入ProtoBuf相关文件到工程下,如下图:
导入到工程的ProtoBuf相关文件这个运行时库有讲究,在工程里调用的,要么保留除了GPBProtocolBuffers.m之外的所有.m文件;要么仅保留一个.m文件GPBProtocolBuffers.m。因为GPBProtocolBuffers.m包含了其他所有.m,这里我们采用后者。
GPBProtocolBuffers.m 为工程添加头文件搜索设置
工程中的详细文件结构参考文末的Demo。
编译生成的.h和.m文件需要在使用ARC的工程中标明例外。