Objective-C protobuf使用

ProtoBuf简介

Protocol Buffer的简称。Google旗下的一款平台无关,语言无关,可扩展的序列化结构数据格式,适合用于数据存储,作为不同应用、语言之间相互通信的数据交换格式,序列化后的数据为二进制数据(pb格式的数据),类比XML、JSON。本文记录的是ProtoBuf在iOS平台oc语言的使用,ProtoBuf3.0.0以上才官方支持Objective-C,低于3.0.0的请忽略或使用第三方转换工具,并且基于性能原因没有使用ARC,但可以被ARC代码调用。

Objective-C的protobuf库,下载地址为
https://github.com/google/protobuf/releases

使用流程:

转换:使用转换的二进制工具protoc,将XXX.proto文件转成Objective C文件,即XXX.h和XXX.m文件。
集成:在iOS项目中加入protobuf库以及上述生成的OC文件

集体步骤:

1.生成protoc

如果没有装autoconf automake libtool需要先装这几个,这里使用brew来安装,在shell执行 brew install autoconf automake libtool即可,如果没有brew请自行先安装brew。 cd进入已下载的protobuf库文件下,执行以下命令:
./autogen.sh
./configure
make
make check
sudo make install
再执行 :
./objectivec/DevTools/full_mac_build.sh
执行完后会看到src目录下生成了protoc二进制文件

注意:cd进入已下载的protobuf库文件路径不要用空格,libtool无法识别路径中的空格,make会失败。本人踩过的坑,浪费时间。

2.使用protoc转换

创建proto文件,比如Student.proto
syntax = "proto3";
message Student
{
required int32 age = 1;
required string name = 2;
optional string address = 3;
}
在src目录(protoc所在目录)执行
protoc --proto_path=... --objc_out=... XXX.proto
其中proto_path是创建的proto文件所在目录,objc_out为Objective-C文件输出路径,XXX.proto是创建的proto文件,可以一次转换多个proto文件,加在XXX.proto后面即可。
如:protoc --proto_path=/Users/admin/Desktop/src --objc_out=/Users/admin/Desktop/dist Student.proto

3.集成

将生成的Ojective-C文件(上面例子的Student.pbobjc.h和Student.pbobjc.m)放到项目中,如果项目使用了ARC,要将.m(例子的Student.pbobjc.m)的Complier Flags设为-fno-objc-arc。(protobuf基于性能原因没有使用ARC)

加入protobuf库,有两种方式

第一种是使用CocoaPods集成。
使用CocoaPods集成,有一个现成的pod可以使用–Protobuf,可以pod search Protobuf搜索查看详情,pod内容为
platform :ios, '7.1'
pod 'Protobuf', '~> 3.1.0'
需要注意的是 platform :ios, ‘7.1’
7.1及以上才能导入这个库,这种方式优点是操作简单,缺点是platform :ios, ‘7.1’ 要7.1或以上

第二种是把相关文件拖入项目中。
拖入相关文件到项目中,将objectivec文件夹下的所有的.h文件和.m文件(除了GPBProtocolBuffers.m)(GPB开头的那些文件)以及整个google文件夹add到项目中,如果项目中使用了ARC需要将以上所有.m文件的的Complier Flags设为-fno-objc-arc。这种方法的优点是灵活性强,没有7.1的束缚。缺点是操作麻烦点,如果用了ARC的话还要手动添加-fno-objc-arc(使用CocoaPods集成会自动添加)

简单使用,示例代码:

  • (void)viewDidLoad {
    [super viewDidLoad];
    Student *student = [[Student alloc] init];
    student.age = 18;
    student.name = @"XiaoMing";
    student.address = @"Beijing";
    NSData *data = [student data];
    NSLog(@"序列化:%@",data);
    Student *s = [Student parseFromData:data error:nil];
    NSLog(@"反序列化:%@",s);
    }

你可能感兴趣的:(Objective-C protobuf使用)