前言:
在不同平臺(tái)通信的時(shí)候,首先需要將對(duì)象進(jìn)行序列化。在iOS平臺(tái)上我們經(jīng)常將數(shù)據(jù)處理為JSON或者XML格式用來(lái)數(shù)據(jù)交互。JSON和XML雖然由于容易維護(hù),易讀而應(yīng)用比較廣泛,所以在HTTP短連接會(huì)使用這兩種數(shù)據(jù)傳輸格式,但是對(duì)于長(zhǎng)連接的即時(shí)通訊,使用這兩種對(duì)數(shù)據(jù)的利用效率都不是高。所以Google提出了 Protocol Buffers(打開(kāi)鏈接需翻墻) 作為一種跨平臺(tái)、語(yǔ)言無(wú)關(guān)的序列化數(shù)據(jù)格式。Protocol Buffers提供代碼生成工具,能夠根據(jù)定義好的數(shù)據(jù)格式生成不同語(yǔ)言的代碼,然后集成到項(xiàng)目中使用。Protocol Buffers目前有兩種格式:proto2和proto3。Protocol Buffers支持Java、Python、C++、C#、Go、Objective-C等代碼的生成。被大家廣泛推崇。
說(shuō)明:
·protobuf3.0.0以上才官方支持Objective-C,低于3.0.0的請(qǐng)忽略或者使用第三方轉(zhuǎn)換工具
·基于性能原因protobuf沒(méi)有使用ARC,但可以被ARC代碼調(diào)用,文中有如何修改編譯方法
使用步驟:
1.轉(zhuǎn)換:將我們編寫(xiě)好的XXX.proto文件轉(zhuǎn)成Objective-C文件,也就是XXX.h和XXX.m文件,轉(zhuǎn)換的工具是使用protoc這種二進(jìn)制文件來(lái)生成的,這個(gè)文件需要自己生成,下面會(huì)介紹如何使用它來(lái)轉(zhuǎn)換Objective-C文件
2.集成:在iOS項(xiàng)目中加入protobuf庫(kù)和步驟1生成的OC文件
轉(zhuǎn)換
1.生成protoc
下載Protocol Buffers的源碼(下載地址),或者直接去下載面向objective-c的protobuf庫(kù)(下載地址)為,要下載對(duì)應(yīng)Objective-C的版本比如 protobuf-objectivec-3.3.0.zip,解壓。 當(dāng)然也可以到官網(wǎng)(需翻墻)下載。
編譯Protocol Buffers。生成重要的代碼生成工具(protoc)。由于Protocol Buffers編譯時(shí)使用了autoconf/automake/libtool等UNIX工具,Mac可能沒(méi)有自帶,需要手動(dòng)安裝。可以使用Homebrew安裝。如果沒(méi)有安裝Homebrew的話,一行代碼搞定,打開(kāi)終端輸入:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
然后安裝需要的UNIX工具
brew install autoconf automake libtool
接下來(lái)cd到下載的目錄下,依次執(zhí)行:
./autogen.sh
./configure
make
make check
sudo make install
再執(zhí)行
- objectivec/DevTools/full_mac_build.sh
執(zhí)行完后會(huì)看到src目錄下生成了protoc二進(jìn)制文件
2.使用protoc轉(zhuǎn)換
創(chuàng)建proto文件,比如Person.proto
syntax = "proto3";
message Person
{
int32 age = 1;
string username = 2;
string phone = 3;
}
需要注意的是要指明proto的語(yǔ)法規(guī)則是proto2還是proto3
在src目錄(protoc所在目錄)執(zhí)行
protoc --proto_path=... --objc_out=... XXX.proto
其中proto_path是我們創(chuàng)建的proto文件所在目錄,objc_out為Objective-C文件輸出路徑,XXX.proto是我們創(chuàng)建的proto文件,可以一次轉(zhuǎn)換多個(gè)proto文件,加在XXX.proto后面即可。
舉例:我們?cè)趕rc目錄下新建兩個(gè)文件夾,gen和protocols文件夾,gen為輸出目錄,protocols用于存放proto文件,將創(chuàng)建的Person.proto放在protocols文件夾下,執(zhí)行命令
protoc --proto_path=protocols --objc_out=gen protocols/Person.proto
然后在gen文件夾下就會(huì)生成Person.pbobjc.h和Person.pbobjc.m文件。
iOS中集成protobuf
1.將生成的Ojective-C文件(上面例子的Person.pbobjc.h和Person.pbobjc.m)放到項(xiàng)目中,如果項(xiàng)目使用了ARC,要將.m(例子的Person.pbobjc.m)的Complier Flags設(shè)為-fno-objc-arc。(protobuf基于性能原因沒(méi)有使用ARC)現(xiàn)在應(yīng)該都是使用的ARC了吧,所以這個(gè)是必須的。
2.加入protobuf庫(kù)
這里有兩種方式
·第一種是使用CocoaPods集成
platform :ios, '7.1'
pod 'Protobuf', '~> 3.1.0'
需要注意的是 platform :iOS, ‘7.1’也就是7.1以上才能導(dǎo)入這個(gè)庫(kù),不過(guò)現(xiàn)在最低支持到8了,可以忽略
·第二種是把相關(guān)文件拖入項(xiàng)目中。
拖入相關(guān)文件到項(xiàng)目中,將objectivec文件夾下的所有的.h文件和.m文件(除了GPBProtocolBuffers.m)(GPB開(kāi)頭的那些文件)以及整個(gè)google文件夾add到項(xiàng)目中,如果項(xiàng)目中使用了ARC需要將以上所有.m文件的的Complier Flags設(shè)為-fno-objc-arc。這種方法的優(yōu)點(diǎn)是靈活性強(qiáng),沒(méi)有7.1的束縛。缺點(diǎn)是操作麻煩點(diǎn),如果用了ARC的話還要手動(dòng)添加-fno-objc-arc(使用CocoaPods集成會(huì)自動(dòng)添加)
第二種我沒(méi)試過(guò),如果想省事,就用cocoapods吧
到此,就可以使用了:
簡(jiǎn)單的使用
- (void)viewDidLoad {
[super viewDidLoad];
//編碼
Person *person = [[Person alloc] init];
person.age = 100;
person.username = @"huang";
person.phone = @"10086";
NSData *data = [person data];
//解碼
Person *p = [Person parseFromData:data error:nil];
NSLog(@"person:%@",p);
}