一、Protocol Buffers
1、簡介
Protocol Buffers是google出的用來序列化和反序列化數據的工具。google提供了多種語言的實現:Java、C#、C++、Go 、 Python、Objective-C,每一種實現都包含了相應語言的編譯器以及庫文件。由于它是一種二進制的格式,比使用XML進行數據交換快許多,可以把它用于分布式應用之間的數據通信或者異構環(huán)境下的數據交換。作為一種效率和兼容性都很優(yōu)秀的二進制數據傳輸格式,可以用于諸如網絡傳輸、配置文件、數據存儲等諸多領域。
2、說明
protobuf3.0.0以上才官方支持Objective-C
環(huán)境:基于性能原因沒有使用ARC,但可以被ARC代碼調用
個人理解pb就是一個序列化和反序列化的工具,數據交換格式。
至于什么是序列化反序列化,在代碼里的展現形式就是:
- (GCDAsynSocketModel *)buildCoordinateRequestHeartBeatBody
{
User *user = [UserManager sharedInstace].usr;
UpDriverPosition *driverPosition = [[UpDriverPosition alloc] init];
driverPosition.driverId = user.ID;//1
driverPosition.longitude = self.locationInfo.longitude;//2
driverPosition.latitude = self.locationInfo.latitude;//3
SInt32 positionType = [[NSString stringWithFormat:@"%lu",(unsigned long)0] intValue];
driverPosition.positionType = positionType;//4
driverPosition.speed = self.locationInfo.speed;//5
driverPosition.bearing = 0.0000;//6
driverPosition.altitude = self.locationInfo.altitude;//7
driverPosition.cityNo = self.locationInfo.citycode;//8
NSString *cityString = [ZTool safeString:self.locationInfo.city];
driverPosition.cityName = cityString;//9
NSDate *timeSpDate = self.locationInfo.timestamp;
NSString *timeSp = [NSString stringWithFormat:@"%f", [timeSpDate timeIntervalSince1970]];
SInt64 upTimestamp = [[NSString stringWithFormat:@"%@",timeSp] intValue];
driverPosition.upTimestamp = upTimestamp;//11
SInt32 carLevel = [[NSString stringWithFormat:@"%lu",(unsigned long)1] intValue];
driverPosition.carLevel = carLevel;//12
GCDAsynSocketModel *asynSocketModel = [[GCDAsynSocketModel alloc]init];
asynSocketModel.businessType = DDGCDAsynSocketConfigBusinessTypeSpecialCar;
asynSocketModel.commandID = DDSocketCommandIDDriverPosition;
asynSocketModel.moduleID = DDGCDAsynSocketConfigModuleIDDriver;
NSData *data = driverPosition.data;
asynSocketModel.transmissionData = data;
return asynSocketModel;
}
這個方法就是將一些信息序列化后,存儲在一個model里面并返回。
二、pb在iOS中的使用
由.proto文件生成OC代碼里能使用的.h和.m文件,即xxx.proto轉化成xxx.pbobjc.h和xxx.pbobjc.m。
1、pbobjc.h和.pbobjc.m生成環(huán)境
如果沒有裝autoconf automake libtool需要先裝這幾個,這里使用brew來安裝,在shell執(zhí)行 brew install autoconf automake libtool即可,如果沒有brew先安裝brew。
(1)安裝homebrew
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
(2)用homebrew安裝automake、libtool和protobuf
依次在終端執(zhí)行如下命令:
brew install automake
brew install libtool
brew install protobuf
2、生成.pbobjc.h和.pbobjc.m
iOS開發(fā)中在用到tcp長鏈接的時候,需要生成.pbobjc.h和.pbobjc.m文件。
拿到.proto文件,將.proto用記事本或者Sublime打開,記得需要指明proto的語法規(guī)則是proto2還是proto3,如下圖:
下載面向Objective-C的protobuf庫,地址為(https://github.com/google/protobuf/releases),要下載對應Objective-C的版本比如 protobuf-objectivec-3.1.0.zip,解壓。
解壓后打開找到objectivec的文件,cd到該文件夾下,然后將objectivec--DevTools-->full_mac_build.sh
將full_mac_build.sh直接拖拽到終端,回車就可以了。
等日志pass打印完畢后,在終端生成.pbobjc.h和.pbobjc.m
我是在桌面上生成.pbobjc文件,所以如下操作:
cd ~/Desktop
protoc --proto_path=. --objc_out=. UpDriver.proto
生成的文件也就保存在了桌面上。
生成命令說明:
protoc --proto_path=. --objc_out=. UpDriver.proto
- protoc 為proto的生成指令 后面添加 參數, 參數的形式為: --參數命令名=參數
- --proto_path=. 指出proto文件所在的根目錄是哪里, 如果用.說明是當前目錄
- --objc_out=. 指出 生成目錄在哪里, 如果用.說明是當前目錄
- UpDriver.proto是你的proto文件名稱
備注:
- 需要注意的事 proto 里面需要指出pb語法的版本; 如 syntax = "proto2"; 有 optional 關鍵字 說明是 proto2版本。
- 生成的.h語.m文件只能使用OC的MRC模式,暫時不支持ARC。所以引入項目后需要添加-fno-objc-arc。
3、pbobjc.h和.pbobjc.m使用
(1)集成protobuf庫
使用 pod集成:
pod 'Protobuf'
手動集成:
將objectivec文件夾下的所有的.h文件和.m文件(除了GPBProtocolBuffers.m)(GPB開頭的那些文件)以及整個google文件夾add到項目中,如果項目中使用了ARC需要設置-fno-objc-arc。
這種方法操作麻煩點,如果用了ARC的話還要手動添加-fno-objc-arc(使用CocoaPods集成會自動添加),記得添加User Header Search Paths為$(PROJECT_DIR)/項目名/后接文件地址 不然頭文件會報錯。
(2)引入xxx.pbobjc.h和xxx.pbobjc.m
將生成的xxx.pbobjc.h和xxx.pbobjc.m文件放入項目中,并添加-fno-objc-arc。
參考文檔:http://blog.csdn.net/sdsd13212/article/details/62044348