iOS网络通信之Protobuf

摘要 在不同平台通信的时候,首先需要将对象进行序列化。iOS平台上我们常用`NSKeyedArchiver`进行归档,当然也可以将数据处理为JSON或者XML格式。`NSKeyedArchiver`只能在iOS/Mac平台使用,因此它归档的二进制数据不适合于在不同平台之间使用。JSON和XML虽然由于容易维护,易读而应用比较广泛,但是对数据的利用效率都不是高。Google提出了 Protocol Buffers作为一种跨平台、语言无关的序列化数据格式。Protocol Buffers提供代码生成工具,能够根据定义好的数据格式生成不同语言的代码,然后集成到项目中使用。Protocol Buffe...

protobuf iOS开发 序列化 数据传输

目录[-]

介绍

在不同平台通信的时候,首先需要将对象进行序列化。iOS平台上我们常用NSKeyedArchiver进行归档,当然也可以将数据处理为JSON或者XML格式。NSKeyedArchiver只能在iOS/Mac平台使用,因此它归档的二进制数据不适合于在不同平台之间使用。JSON和XML虽然由于容易维护,易读而应用比较广泛,但是对数据的利用效率都不是高。Google提出了 Protocol Buffers 作为一种跨平台、语言无关的序列化数据格式。Protocol Buffers提供代码生成工具,能够根据定义好的数据格式生成不同语言的代码,然后集成到项目中使用。Protocol Buffers目前有两种格式:proto2和proto3。Protocol Buffers支持Java、Python、C++、Objective-C等代码的生成。

准备工作

  1. 下载Protocol Buffers的源码(下载地址),也可以到官网上下载。
  2. 编译Protocol Buffers。虽然我们是可以直接将它的代码或者项目引入Xcode中,但是还是需要编译重要的代码生成工具(protoc)。由于Protocol Buffers编译时使用了autoconf/automake/libtool等UNIX工具,Mac可能没有自带,需要手动安装。我们可以使用HomeBrew或者MacPort进行安装(二选一就行)。
    • 使用 HomeBrew 安装:
    $ brew install autoconf
    $ brew install automake
    $ brew install libtool
    
    • 使用 MacPort 安装:
    $ sudo port install autoconf automake libtool
    

README.md中说可以直接用./configure进行配置并编译运行了,但实际还差一步,就是运行./autogen.sh脚本,否则会发生错误。然而遗憾的是,autogen.sh中会下载https://googlemock.googlecode.com/files/gmock-1.7.0.zip。gmock处于 墙外 ,只能用梯子出去取(没梯子的可以找 戴维营教育 交流群免费索取,会不会被请喝茶啊)。

没有运行autogen.sh的场景:

$ ./configure --with-protoc=protoc
$ ./configure: line 2215: syntax error near unexpected token ‘enable‘
$ ./configure: line 2215: ‘AM_MAINTAINER_MODE(enable)‘

一旦打开VPN了,运行下面的脚本:

$ ./autogen.sh
$ ./configure
$ make
# 如果希望安装protoc,执行下面的命令
$ make install

iOS中使用Protocol Buffers

  1. 创建 proto 文件指定数据格式,可以选择proto2和proto3格式,它们有些细微的区别,在生成代码的时候会提示的,具体情况查看文档Language Guide proto3。下面使用proto3格式,并且保存为Person.proto。
syntax = "proto3";

message Person {
  string name = 1;
  int32 uid = 2;
  string email = 3;

  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }

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

  repeated PhoneNumber phone = 4;
}
  1. 使用 protoc 工具生成Objective-C代码。其中--proto_path=后跟需要处理的proto文件所在的文件夹,--objc_out=指明生成的是Objective-C代码以及目标文件存放路径,最后是需要处理的文件。
$ protoc --proto_path=. --objc_out=. Person.proto
$ ls
Person.pbobjc.h    Person.pbobjc.m    Person.proto

处理完成后,生成两个文件,分别是 Person.pbobjc.h 和 Person.pbobjc.m 。这两个文件是采用的手动引用计数,因此在加入项目后需要设置它们的编译参数。

  1. 为了方便管理,我们直接将Protocol Buffers中的iOS静态库项目引入进来。当然,如果喜欢用C++的话,可以直接将C++代码导入项目,记得设置 Header Search Paths 或者 User Header Search Paths 。

设置依赖和连接库。

  1. 引入头文件开始使用。
#import "GPBProtocolBuffers.h"
#import "Person.pbobjc.h"

- (void)viewDidLoad {
    [super viewDidLoad];

    Person *person = [[Person alloc] init];
    person.name = @"Zhangsan";
    person.email = @"[email protected]";
    person.uid = 23;
    NSData *data = [person data];

    NSString *path = @"/Users/apple/Desktop/test.data";
    [data writeToFile:path atomically:YES];

    NSData *ldata = [NSData dataWithContentsOfFile:path];
    Person *p = [Person parseFromData:ldata error:nil];
    NSLog(@"\nname:%@\nemail:%@\nuid:%d", p.name, p.email, p.uid);
}

打印结果如下:

2015-12-02 13:09:46.890 ProtobufDemo[34761:150533]
name:Zhangsan
email:[email protected]
uid:23
  1. Protocol Buffer效率测试 我们这里说的效率是指空间占用率。简单和JSON格式比较一下,同样是存储下面的信息:
name: Zhangsan
email: diveinedu@qq.com
uid: 23

采用Protocol Buffers的数据大小为30个字节。而实用JSON存储时,尽管我们将Key变成一个字节,如下:

NSDictionary *dict = @{@"n":@"Zhangsan",
                       @"e":@"[email protected]",
                       @"u":@23};
NSData *jd = [NSJSONSerialization dataWithJSONObject:dict options:0 error:nil];
NSLog(@"jd: %lu", jd.length);

JSON数据还是占了46个字节,并且随着可读性提高,效率更低。XML就更不用说了。

总结

如果希望获得更好的的可读性,可以选用JSON和XML这类文本格式。但如果从数据效率上将,Protocol Buffer是一个不错的选择。存储效率高,并且proto文件的可读性和可维护性都比较强。

时间: 2024-08-26 07:58:17

iOS网络通信之Protobuf的相关文章

iOS学习笔记(八)——iOS网络通信http之NSURLConnection

转自:http://blog.csdn.net/xyz_lmn/article/details/8968182 移动互联网时代,网络通信已是手机终端必不可少的功能.我们的应用中也必不可少的使用了网络通信,增强客户端与服务器交互.这一篇提供了使用NSURLConnection实现http通信的方式. NSURLConnection提供了异步请求.同步请求两种通信方式. 1.异步请求 iOS5.0 SDK NSURLConnection类新增的sendAsynchronousRequest:queu

【转】iOS学习笔记(八)——iOS网络通信http之NSURLConnection

移动互联网时代,网络通信已是手机终端必不可少的功能.我们的应用中也必不可少的使用了网络通信,增强客户端与服务器交互.这一篇提供了使用NSURLConnection实现http通信的方式. NSURLConnection提供了异步请求.同步请求两种通信方式. 1.异步请求 iOS5.0 SDK NSURLConnection类新增的sendAsynchronousRequest:queue:completionHandler:方法,从而使iOS5支持两种异步请求方式.我们先从新增类开始. 1)se

iOS 学习资料

(适合初学者) 本文资料来源于GitHub 一.视频教程(英文) Developing iOS 7 Apps for iPhone and iPad斯坦福开放教程之一, 课程主要讲解了一些 iOS 开发工具和 API 以及 iOS SDK 的使用, 属于 iOS 基础视频 iPad and iPhone Application Development该课程的讲师 Paul Hegarty 是斯坦福大学软件工程学教授, 视频内容讲解得深入, 权威, 深受好评 Advanced iPhone Dev

GitHub 上排名前 100 的 IOS 开源库简介

主要对当前 GitHub 排名前 100 的项目做一个简单的简介, 方便初学者快速了解到当前 Objective-C 在 GitHub 的情况. 项目名称 项目信息 1. AFNetworking 作者是 NSHipster 的博主, iOS 开发界的大神级人物, 毕业于卡内基·梅隆大学, 开源了许多牛逼的项目, 这个便是其中之一, AFNetworking 采用 NSURLConnection + NSOperation, 主要方便与服务端 API 进行数据交换, 操作简单, 功能强大, 现在

【转】GitHub 排名前 100 的安卓、iOS项目简介

GitHub Android Libraries Top 100 简介 排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果, 然后过滤了跟 Android 不相关的项目, 所以排名并不具备任何官方效力, 仅供参考学习, 方便初学者快速了解当前一些流行的 Android 开源库. 项目名称 项目简介 1. react-native 这 个是 Facebook 在 React.js Conf 2015 大会上推出的基于 JavaScript 的开源框架 Re

iOS开发中常用的轮子 第一篇

为避免重复造轮子,很多效果和功能都可以从github上找到.清点以前的项目,整理出了很多用过的开源代码,每天奉送10个. 第一篇  同色的代表是实现了同个功能,按自己需求挑选一个 项目名称 项目信息 1. AFNetworking 作者是 NSHipster 的博主, iOS 开发界的大神级人物, 毕业于卡内基·梅隆大学, 开源了许多牛逼的项目, 这个便是其中之一, AFNetworking 采用 NSURLConnection + NSOperation, 主要方便与服务端 API 进行数据交

开源中国iOS客户端学习

开源中国iOS客户端学习 续写前言 <开源中国iOS客户端学习>续写前系列博客    http://blog.csdn.net/column/details/xfzl-kykhd.html 开源中国iOS客户端学习——序 说到这款开源软件就得提到她的娘家了--开源中国社区: 开源中国社区简介:开源中国 www.oschina.net 成立于2008年8月,是目前中国最大的开源技术社区.传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现.使用.并交流开源技术的平台.目前开源中国社区已收

iOS 如何做才安全--逆向工程 - Reveal、IDA、Hopper、https抓包 等

iOS应用的安全性 常常被大家忽视. 1.首先,我们可以通过软件 下载 AppStore的ipa文件(苹果 把开发者上传的ipa进行了加壳再放到AppStore中), 得到ipa文件 可以分析APP 里包含的一些资源,如:图片.plist文件.静态wap页..bundle 等. 所以不要 在plist文件.项目中的静态文件中 存储关键的信息,如果要保存,记得加密(这样可以增加破解的难度). 2.我们可以用软件 查看 APP的沙盒,查看里面存储的 文件(sqlite.plist(NSUserdef

史上最全的IOS电子书PDF制作

本人背靠海量纸质图书,可以制作各种纸质书籍的电子化,有需要可以Q:1481449626 <iOS编程 第3版 针对Xcode 4.3 Big Nerd Ranch培训系列>作者:JoeConway,AaronHillegass著:夏伟频译 页数:589 出版社:武汉市:华中科技大学出版社 出版日期:2013.01 简介:<iOS编程(第3版)>更新了iOS5和Xcode4.3的内容.全书涵盖了开发iOS应用的方方面面.从Objective-C基础知识到新增加的语言特性:从AppKi