前段时间需要做紧凑排列的二进制数据的序列化与反序列化,老大让我研究谷歌的pb,尝试使用pb来做这些,说相对而言耦和性比较小,然后我就研究了下这个东西。
1.首先要知道pb具体是什么
Protocol buffers是一个灵活的,高效的,有自动机制(可能指编解码)工具用于序列化结构数据。类似XML,但是更小、更快、更简单。你定义你的结构化数据,然后就可以使用工具生成的你需要的语言的代码,从各种数据流中读写你的结构化数据。如果还是有不明白的就自己去谷歌了。(我简单的理解,是将规定形式排列的二进制数据进行序列化和反序列化工具)
2.安装代码生成工具
2.1 首先下载源代码:https://github.com/google/protobuf
2.2 编译重要的代码生成工具
使用 HomeBrew 安装:
- $ brew install autoconf
- $ brew install automake
- $ brew installlib tool
脚本
$ ./autogen.sh
$ ./configure
$ make
# 如果希望安装protoc,执行下面的命令
$ make install
3.将源代码中的oc的文件打包成一个静态库或者frmework放进项目中使用,也可以直接将这个文件夹(将objectivec文件夹下的所有的.h文件和.m文件,除了GPBProtocolBuffers.m)拖到项目中使用。
4.PB 的使用
如果上面编译没有错误,下面就可以正式的使用pb了。具体使用如下
4.1 新建文件夹和.proto文件。
4.1.1新建文件夹如下
gen文件夹主要装生成的目标文件
protocols文件夹主要装.proto文件
4.1.2 .proto文件的具体格式。
在.proto文件里首先确定文件的格式版本,总共有两个版本。proto3比proto2要更新,两者有稍微区别,具体两个版本的文件格式建议参照官网:https://developers.google.com/protocol-buffers/docs/proto
4.2 .使用PB编译器编译.proto文件
在终端输入protoc --proto_path=... --objc_out=... XXX.proto
--proto_path对应的是.proto文件文件夹(protocols文件夹)的路径。
--objc_out是生成模型文件夹(gen)路径。
XXX.proto是.proto路径。
执行命令会在gen文件夹下生成模型文件,将文件添加到项目中,并将.mComplier Flags设为-fno-objc-arc。(protobuf基于性能原因没有使用ARC)
4.3.在项目中使用PB完成序列化&反序列化
示例如下:
// 创建对象
Person *person = [Person new];
person.name = @"TanHao";
person.uid = 28;
// 序列化为Data
NSData *data = [person data];
// 反序列化为对象
Person *person2 = [Person parseFromData:data error:NULL];
NSLog(@"name:%@ sex:%d age:%d",person2.name,person2.sex,person2.age);
由于写这个文章时我已经做完这个有段时间了,其实在开始安装代码生成工具时在终端遇到不少问题,建议大家在官方推荐的地址下载最新的pb然后在进行配置,有问题欢迎留言交流。我的两个pb的demo,一个大成framework了,一个直接使用的,打成framework的已经上传,地址如下:https://github.com/Jing2684/ProtocolBuffersDemo