简介:
Protocol Buffer是google 的一种数据交换的格式,已经在Github开源,目前最新版本是3.1.0。它独立于语言,独立于平台。google 提供了多种语言的实现:Java、C#、C++、Go和Python,Objective-C,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比使用 XML 进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。
官网:
https://developers.google.com/protocol-buffers/
https://github.com/google/protobuf
个人安装使用的过程:
1.首先在github上下载全部代码,下载完成解压后放在指定的使用位置(我放在桌面了)
2.安装依赖库
brew install autoconf
brew install libtool
brew install automake
3.执行命令 cd /Users/zhangyu/Desktop/protobuf-master/objectivec/DevTools/,然后在执行sudo shfull_mac_build.sh进行编译,如果报错,有可能是依赖没有加上,按照报错的原因加上就好(我这边编译的时候报:Timed out waiting 120 seconds for simulator to boot),我就强制关闭了,原因不知道。。。能力有限了
4.安装完成后在/Users/zhangyu/Desktop/protobuf-master/src/ 目录下生成 protoc 可执行程序,以后会用到这个protoc可执行程序把 .proto文件生成oc文件也就是.h.m文件。
5.创建一个.proto文件(参照别人写的)Person.proto文件
创建文件:新建一个文件夹然后在终端cd打开(我的:cd /Users/zhangyu/Desktop/protoTest)然后在执行 touch Person.proto
将以下内容填写
syntax ="proto3”;
message Person
{
stringname =1;
int32 age=2;
stringaddress =3;
}
需要注意的是要指明proto的语法规则是proto2还是proto3。
6.使用protoc可执行程序将.proto文件生成.h.m文件。
首先进入到protoc这个可执行程序的目录 cd /Users/zhangyu/Desktop/protobuf-master/src
然后在执行 ./protoc --proto_path=/Users/zhangyu/Desktop/protoTest --objc_out=/Users/zhangyu/Desktop/proto_objc /Users/zhangyu/Desktop/protoTest/Person.proto
讲解上面三个目录,第一个是创建.protoc文件的目录,第二个是你想把生成的.h.m文件放到的目录(我这里是在桌面上新建了一个proto_objc文件夹),第三个是.proto文件 。
执行完上面的步骤,就会在你建的文件夹里面生成.h.m文件了。
7.集成到项目中,新建一个项目,将生成的Ojective-C文件(上面例子的Person.pbobjc.h和Person.pbobjc.m)放到项目中,如果项目使用了ARC,要将.m(例子的Person.pbobjc.m)的Complier Flags设为-fno-objc-arc。(protobuf基于性能原因没有使用ARC)
加入protobuf库,有两种方式
第一种是使用CocoaPods集成
使用CocoaPods集成,有一个现成的pod可以使用–Protobuf,可以pod search Protobuf搜索查看详情,pod内容为
pod'Protobuf'
第二种是把相关文件拖入项目中。
拖入相关文件到项目中,将objectivec文件夹下的所有的.h文件和.m文件(除了GPBProtocolBuffers.m)(GPB开头的那些文件)以及整个google文件夹add到项目中,如果项目中使用了ARC需要将以上所有.m文件的的Complier Flags设为-fno-objc-arc。这种方法的优点是灵活性强,没有7.1的束缚。缺点是操作麻烦点,如果用了ARC的话还要手动添加-fno-objc-arc(使用CocoaPods集成会自动添加),记得添加User Header Search Paths为$(PROJECT_DIR)/项目名/后接文件地址 不然头文件会报错
简单使用
直接上代码
- (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);
}
参考
原文地址:http://blog.csdn.NET/hyq4412/article/details/54891038