Protobuf简介(来自百度百科)
protocolbuffer(以下简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台。google 提供了多种语言的实现:java、c#、c++、go 和 python,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比使用 xml 进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。
在MacOS上安装适用于Objective-C的Protobuf编译器
检查系统是否安装Homebrew
brew -v
如果没安装Homebrew
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
安装Protobuf编译器和依赖文件
brew install automake
brew install libtool
brew install protobuf
从github克隆protobuf-objc,执行build.sh文件
git clone https://github.com/google/protobuf.git
cd protobuf/objectivec/DevTools
./full_mac_build.sh
编译.proto文件
protoc --plugin=/usr/local/bin/protoc-gen-objc *.proto --objc_out="./"
PS:之后会生成两个文件 xxx.pbobjc.h
和 xxx.pbobjc.m
把这两个文件拖到项目中即可使用。需要注意的是这个类不支持arc,所以要在 Build Phase -> Compile Sources
中在xxx.pbobjc.m
文件加上-fno-objc-arc
。
将protobuf引入到项目中
看具体项目需要了,你可以选择cocoapod引入,也可以打包静态库引入项目,当然直接把相关文件放进项目也是可以的,第一种最简单了。我看往上前两种都给出教程了,就尝试了第三种方案,步骤如下:
- 找到
objectivec
文件夹,将除了Tests
文件夹之外的文件拉入工程 - 找到
GPBProtocolBuffer.m
文件将引入的所有.m文件注释掉
如果不注释调,会报错duplicate symbol
。
使用protobuf序列化和反序列化数据
-
定义模型的
Person.proto
文件message Person { required int32 id = 1; required string name = 2; optional string email = 3; }
编译proto文件,得到
Person.pbobjc.h
和Person.pbobjc.m
文件,拉到项目里面。注意得到的文件是不支持arc模式的。在
Build Phases
的Compile Sources
中,找到Person.pbobjc.m
文件,设置Compiler Flags
为-fno-objc-arc
。创建模型并将模型序列化为二进制
Person *person = [[Person alloc] init];
person.id_p = 11;
person.name = @"xiaoming";
person.email = @"xiaoming@gmail.com";
NSData *data = [person data]; // 序列化为二进制
- 将二进制反序列化为模型对象
Person *parsePerson = [Person parseFromData:data error:nil];
NSLog(@"id = %d , name = %@, email= %@", parsePerson.id_p, parsePerson.name, parsePerson.email);
DEMO地址:ProtobufForObjectiveCDemo
参考:
https://www.ibm.com/developerworks/cn/linux/l-cn-gpb/
http://www.jianshu.com/p/751aa2b621d5
http://www.jianshu.com/p/e06ba6249edc
http://blog.devzeng.com/blog/ios-protobuf.html
http://www.jianshu.com/p/25baebc411fe