新入公司,公司用的是protocolbuffer这种格式进行数据传递,之前也没接触过,所以陪了两天环境才弄好。
本文分为以下内容
使用流程
注意事项
原理和优缺点
-
使用流程,
-
后端给了几个.proto文件 可以用atom打开
类似这种 后台给的文件
后端给的文件
- 下载pb脚本,不同版本的脚本生成的代码不一样
github上最新的脚本是3.5.2,用homebrew默认安装则是这个最新的版本,如果用这个版本,则需要将github上的代码考入到本地工程,进行编译 如果有这种方法的话,可以参考这篇文章(他用的是3.1.0,一样的):https://www.cnblogs.com/tandaxia/p/6181534.html
我是选择从github上down的2.6.1版本(原因第4步说),在终端执行编译脚本命令
githud下载地址protobuf-2.6.1.tar.gz压缩文件,然后解压
在文件夹目录下依次执行命令
./configure
make
make check
sudo make install
如果上述操作没毛病的话,就会在/usr/local/bin文件夹下有个protoc的可执行文件(这个不用执行,不用管它)
- 下载脚本依赖库 ,将proto文件通过脚本变成oc的pb类
下载脚本依赖库:https://github.com/alexeyxo/protobuf-objc
cd到该依赖库文件夹,然后./scripts/build.sh
然后如果没意外的话usr/local/bin 下就会有个protoc-gen-objc可执行文件
cd到刚才后端给的文件夹目录下 执行命令:
protoc --plugin=/usr/local/bin/protoc-gen-objc 你的文件.proto --objc_out="./"
会生成.h.m文件
- 将pb类拖入工程,然后通过第三方代码进行读取和封装
这里很关键,一开始我用的3.5.1脚本生成的hm文件要从github上拖代码下来进行中间转发成oc框架可读取的类,由于我太懒,就没这么做,
因为对于2.6.1的脚本的版本生成hm文件,git上有个pod库可以转成oc框架可读取的类,所以我用的2.6.1脚本,然后按照第三部生成的代码拖入工程
5.将生成的data数据发送给后端
CheckVersionReqBuilder *builder= [CheckVersionReq builder];
builder.channel = channel;
builder.version = version;
NSData *data = [builder build].data;
//设置request
NSString *url = [NSString stringWithFormat:@"%@%@",API_BASE_URL,requestTask.path];
APLog(@"url == %@\n参数 == %@\n",url,requestTask.requestPb);
[self.request setHTTPBody:data];
[self.request setURL:[NSURL URLWithString:url]];
[[self.sessionManager dataTaskWithRequest:self.request
completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) {
//result
}]resume] ;
-
注意事项
因为这个protoc文件是后端给的,里面定义了模型,也就是说每次请求的模型有变动的话,除了改代码之外还得更新文件 重新生成pb.h .m,别想着自己在生成的类里增加个字段
网络请求和返回的模型都是生成好的了,可以直接用,当然如果想用去模型化的设计方案就比较头痛了
-
原理和优缺点
原理我也只是看过大致懂,看的是这篇文章:https://blog.csdn.net/carson_ho/article/details/70568606
优缺点,结合本人使用情况说下:
优点:
- 由于编码方法影响的传输体积比较小
- 序列化和反序列速度快很多
- 进行了简单的编码,所以加密性好一点点,真的只是一点点
- 跨平台? 我觉得是没什么用的,不认为是优点
缺点:
- 比起主流的json/xml 需要学习成本,特别是配使用环境那一段
- 维护成本,每次更新参数需要重新编译文件
- 让人误以为的加密好,我在开发中发现账号密码传过去的data 强转成string之后会显示数字密码,很尴尬,所以还是用了个aes加密
- 不可直观的读取出传输前的数据
以上是文章的所有内容,如果有帮到您的地方,希望点个赞,谢谢
网友评论