一、Protocol Buffers
1、简介
Protocol Buffers是google出的用来序列化和反序列化数据的工具。google提供了多种语言的实现:Java、C#、C++、Go 、 Python、Objective-C,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比使用XML进行数据交换快许多,可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。
2、说明
-
protobuf3.0.0以上才官方支持Objective-C
-
环境:基于性能原因没有使用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生成环境
如果没有装autoconf automake libtool需要先装这几个,这里使用brew来安装,在shell执行 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
依次在终端执行如下命令:
brew install automake
brew install libtool
brew install protobuf
2、生成.pbobjc.h和.pbobjc.m
iOS开发中在用到tcp长链接的时候,需要生成.pbobjc.h和.pbobjc.m文件。
拿到.proto文件,将.proto用记事本或者Sublime打开,记得需要指明proto的语法规则是proto2还是proto3,如下图:
proto.png下载面向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
网友评论