Protocol Buffers for iOS

Protocol Buffers 是 Google 出品的用来序列化/反序列化数据的工具。原生支持 C++、Java、Python。

如果要在 iOS 上使用 PB,可以直接使用 C++,但是编译过程很麻烦,因此这里使用的是第三方的库。


安装 Protocol Buffers

安装 homebrew

1. ruby-e"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

安装 automake、libtool、protobuf。这里安装的 protobuf 是 google 官方版本。

1. brew install automake

2. brew install libtool

3. brew install protobuf

如果后面的步骤出错了,请确保已经安装了这些工具:automake、autoconf、autoreconf、aclocal、libtool、protoc。其中的 protoc 用来把 .proto 文件编译成 C++、Java 或 Python 代码。

编译 protoc-gen-objc。protoc-gen-objc 是 protoc 的一个插件,使其能将 .proto 文件编译成 objective-c 代码。

1. gitclonegit@github.com:alexeyxo/protobuf-objc.git

2. cdprotobuf-objc

3. ./autogen.sh

# 后面的参数保证 configure 能找到 protobuf 相关的头文件和库

# 避免报 protobuf headers are required 错误

4. ./configure CXXFLAGS=-I/usr/local/include LDFLAGS=-L/usr/local/lib

5. make

6. make install

利用 protoc 将 .proto 文件编译成 objective-c 代码。

1. protoc message.proto --objc_out="."

如果出现下面的错误:

1 protoc-gen-objc: program not found or is not executable

2 --objc_out: protoc-gen-objc: Plugin failed with status code1.

可以尝试:

1. cp /PATH/TO/protobuf-objc/src/compiler/protoc-gen-objc /usr/local/bin

在 Podfile 中添加pod 'ProtocolBuffers', '1.9.2'然后执行pod install。

将生成的 .h 和 .m 文件添加到工程中,编译。

这里会提示找不到GeneratedMessageProtocol。你只需要帅气地将其注释掉就行了。


使用

假设有 person.proto 定义如下

messagePerson {

requiredint32id =1;

requiredstringname =2;

optionalstringemail =3;

}

通过 protoc 生成 Person.pb.h 和 Person.pb.m 两个文件。

序列化

Person* person = [[[[[Person builder] setId:123]

setName:@"Bob"]

setEmail:@"bob@example.com"] build];

NSData* data = [person data];

反序列化

NSData* raw_data = ...;

Person* person = [Person parseFromData:raw_data];

参考

http://protobuf.axo.io/#objc

https://github.com/alexeyxo/protobuf-obj

http://www.2cto.com/kf/201503/382440.html


来自http://www.2cto.com/kf/201503/382440.html的内容

在github上有protobuf-objc,其中的readme可以教会我们安装proto到咱们电脑里面。然后利用protoc,也就是protobuf的编译器可以编译.proto文件,生成一些.h和.m文件。 在移动App中,使用protobuffer可以做储存,可以做网络传输,可以干很多和数据打交道的事情。 最简单的,加入做一个APP,你要记录用户数据对吧?用户账号是?密码是?性别是?有没有女朋友? 为了记录这些数据到服务器,就需要合适的数据结构。有人说,为什么一定要用protobuf?为什么不用其他的如json?如xml?关于这个问题,请到stackoverflow,csdn等格调甚高的地方去寻找,去发现。。我要用的原因,就是我需要用,不用就会落后,就会挨打。。

首先是怎么安装protobuf这个工程。 (摘抄一段来自https://github.com/alexeyxo/protobuf-objc的文档)

How To Install Protobuf

Building the Objective-C Protobuf compiler

Check if you have Homebrew

brew -v

If you don't already have Homebrew, then install it

ruby -e $(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)

Install the main Protobuf compiler and required tools

brew install automake

brew install libtool

brew install protobuf

(optional) Create a symlink to your Protobuf compiler.

ln -s /usr/local/Cellar/protobuf/2.6.1/bin/protoc /usr/local/bin

Clone this repository.

git clone https://github.com/alexeyxo/protobuf-objc.git

Build it!

./build.sh

什么?看不懂?没关系,本爷就是为了翻译才贴上的

首先,打开终端!

brew -v

:查看你的mac里面有没有装brew。brew是mac os里面,类似于ubuntu的apt-get的功能,都可以直接在终端输入命令然后安装程序。-v自然就是版本version的意思

ruby -e $(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)

这一句半懂不懂,,大概就是利用curl工具访问那个url,然后在ruby环境下载安装brew

brew install automake

brew install libtool

brew install protobuf

就是利用brew下载安装了。protobuf就是我们想要的,另外两个是依赖库

git clone https://github.com/alexeyxo/protobuf-objc.git

./build.sh

从github下载protobuf-objc这个工程,build脚本里面做的是编译

注意:编译工程过程中,有可能会出现错误。别慌!看编译错误的提示。一般错误只是因为环境变量和路径没有配置好,少了一些东西,例如少了编译protobuf这个工程的依赖库,按照提示添加路径即可

有了工程以后,我们就可以开始测试一下怎么用protobuf了

打开Xcode!新建一个工程! 然后有两个方法把protobuf添加到你的工程里面,一个是直接添加,一个是利用cocoapod 强烈推荐后者,因为cocoapods能够很方便的管理第三方类库,以后人家的工程升级了,你只需要一行 pod update 就ok~duang~

关于安装和使用cocoapod,属于另一个话题,看另一个博文 在Podfile添加下面这个句子

platform :ios , 6.0

pod ProtocolBuffers, ~> 1.9.7

在保存之后,到终端,cd到工程里面,

pod install

等一会,cocoapod就会帮我们添加好,以后我们就应该打开 project的workspace,因为添加了pod作为子工程。

还没结束 在你的工程里面,新建一个文件夹,命名假如叫Protobuf 在这个文件夹里面新建一个proto文件。例如要在本地储存用户信息,那么就新建一个user.proto 里面内容可以如下

package csdnblog;

message PBUser {

required string userId = 1;                      // 用户ID

optional string nick = 2;                        // 用户昵称

optional string avatar = 3;                      // 用户头像

optional string password = 7;

optional string email = 8;

optional string mobile = 9;                      // 手机号码

optional string qqOpenId = 10;                    // QQ ID

optional string sinaId = 11;                      // SINA UserID

optional string weixinId = 12;                    // WeChat UserID

}

上面这个例子包括了几个要素。 一个是包名。包的概念在object c里面没有,java里面有,c++里面namespace也是差不多意思。 顺便提一下,oc里面一般在库名前面添加两个字母,起的作用差不多就是包的作用,作为类的上一层组织结构。 例如官方的NS,例如AFNetworking这种第三方类库的AF。

回到正题。编写pb文件,第二个要素是message 一个message就是一个整体,里面有哪些必要的内容,哪些可选的内容。详细的proto语法随便一找一大把,就不啰嗦了。

写好了proto,接下来就是编译这个proto文件,protobuf-objc这个类库会编译声称一些源码,是读写proto数据的接口API。 编译命令如下: 先打开工程,建议单独新建一个文件夹作为输出路径,例如工程下新建文件夹Gen,用来放generate出来的.pb.h文件&&.pb.m文件 打开终端 cd到工程路径下

protoc --plugin=/usr/local/bin/protoc-gen-objc person.proto --objc_out=./Gen

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容