Protocol Buffers是用于结构化数据串行化的灵活、高效、自动的方法,有如XML,不过它更小、更快、也更简单。你可以定义自己的数据结构,然后使用代码生成器生成的代码来读写这个数据结构。你甚至可以在无需重新部署程序的情况下更新数据结构。
Protocol Buffers拥有多项比XML更高级的串行化结构数据的特性:
- 更简单
- 小3-10倍
- 快20-100倍
- 更少的歧义
- 可以方便的生成数据存取类
官方版本支持C++\Java\Python三门语言,但是还有很多非官方的语言版本支持,如C、NET(C#、Vb.net)、Flex(AS3)、object-c等.
具体如何使用参考:http://www.cppblog.com/woaidongmao/archive/2009/06/23/88391.html
下面总结下在ios下面怎么配置运行环境:
1、下载ProtocolBuffer包:
注意:2.5版本与下面的object-c插件不兼容,建议下载2.4.1版本的
http://code.google.com/intl/zh-CN/apis/protocolbuffers/
编译安装(生成的编译器protoc在/usr/local/bin目录下):
注:在安装protoBuf包之前首先要确认安装过gcc(可以在终端下输入gcc - version测试)。如果没有安装 Xcod->Preferences->Downlaods->components 安装Command Line
Tools. 在安装过程中如安装失败,就以管理员的身份安装,在命令前加sudo如,sudo make install
2、下载Objective-C compiler for ProtocolBuffer
目前有两种类型的实现:
(1)、针对ProtocolBuffer2.2做修改,使最后生成的.proto文件编译器(protoc)支持Objective-C类型的文件输出。
http://code.google.com/p/metasyntactic/wiki/ProtocolBuffers
(2)、针对ProtocolBuffer2.3推出的plugin模式编写插件,以插件方式支持Objective-C类型的文件输出。
https://github.com/booyah/protobuf-objc
我选用第二种方式,这也是Google推荐的方式。
git clone https://github.com/booyah/protobuf-objc.git
进入该目录,并执行(生成的插件protoc-gen-objc在/usr/local/bin/目录下):
注:在执行./autogen.sh时会执行失败则
需要安装autoconf 和automake 安装过程如下:
curl -O http://mirrors.kernel.org/gnu/m4/m4-1.4.13.tar.gz
tar -xzvf m4-1.4.13.tar.gz
cd m4-1.4.13
./configure –prefix=/usr/local
make
sudo make install
cd ..
curl -O http://mirrors.kernel.org/gnu/autoconf/autoconf-2.65.tar.gz
tar -xzvf autoconf-2.65.tar.gz
cd autoconf-2.65
./configure –prefix=/usr/local
make
sudo make install
cd ..
curl -O http://mirrors.kernel.org/gnu/automake/automake-1.11.tar.gz
tar xzvf automake-1.11.tar.gz
cd automake-1.11
./configure –prefix=/usr/local
make
sudo make install
cd ..
curl -O http://mirrors.kernel.org/gnu/libtool/libtool-2.2.6b.tar.gz
tar xzvf libtool-2.2.6b.tar.gz
cd libtool-2.2.6b
./configure –prefix=/usr/local
make
sudo make install
3、测试.proto文件编译
写一个person.proto文件:
2 | required string name = 1; |
4 | optional string email = 3; |
13 | required string number = 1; |
14 | optional PhoneType type = 2 [ default = HOME]; |
17 | repeated PhoneNumber phone = 4; |
编译该文件:
To compile the proto files using protoc, you want to indicate the path of the source files,
To compile the proto files using protoc, you want to indicate the path of the source files,
the directory to output the files to, and indicate the language.
For example, for C++, you will do something like this:
protoc --proto_path=src --cpp_out=build/cpp src/StoryRequest.proto
And for Objective-C, you will do something like this:
protoc --proto_path=src --objc_out=build/objc src/StoryRequest.proto
protoc –objc_out=/Output/Directory/ person.proto
protoc会使用该插件编译.proto文件,最终生成两个文件:Person.pb.h 、Person.pb.m (不支持ARC)
如果项目中使用了ARC ,所以需要使用 -fno-objc-arc 来标识相关的文件不使用ARC机制:

这个步骤通过后,说明ProtocoBuffer Compiler for Objective-C可以正常工作了。
4、在Xcode中使用ProtocolBuffer
将步骤2中protobuf-obj/src/runtime/Classes目录导入到Xcode项目中,导入时,选中”Copy items into destination group‘s folder(if needed)“。
导入位置选择项目根目录。导入完毕后,项目根目录下将会出现Classes目录,将该目录改名为ProtocolBuffers(注意最后的s): mv Classes ProtocolBuffers
修改项目属性中”Build Settings–>Search Paths–>Header Search Paths”,将项目根目录“.”添加到头文件搜索路径中去。

这样ProtocolBuffer for Objective-C的工作环境就配置好了。
5、使用
1)、将步骤3中编译输出的Person.pb.h 和Person.pb.m添加到项目中
2)、将Person.pb.h 中的 #import <ProtocolBuffers/ProtocolBuffers.h> 改为#import”ProtocolBuffers/ProtocolBuffers.h”
3)、在需要使用的地方引入头文件:#import “Person.pb.h”
6 | [self writeAndReadProtobuf]; |
9 | - ( void )writeAndReadProtobuf{ |
10 | Person *person = [[[[[Person builder] setName:@ "极致" ] |
12 | setEmail:@ "abc@163.com" ] build]; |
13 | NSData *data = [person data]; |
15 | NSString *docPath = [self applicationDocumentsDirectory]; |
16 | NSString *path = [docPath stringByAppendingFormat:@ "/person.data" ]; |
18 | if ([data writeToFile:path atomically:YES]) { |
19 | [self readFileWithPath:path]; |
23 | - (NSString *)applicationDocumentsDirectory { |
25 | NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); |
26 | NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil; |
30 | - ( void )readFileWithPath:(NSString *)path { |
32 | NSData *data = [NSData dataWithContentsOfFile:path]; |
33 | Person *person = [Person parseFromData:data]; |
36 | NSLog(@ "\n id %d \n name: %@ \n email: %@ \n" ,person.id, person.name, person.email); |
输出打印的结果如下:

遇到的问题:
在执行 ./autogen.sh时出现错误: /autogen.sh: line 10: autoreconf: command not found
解决办法:需要安装automake和autoconf: