Protocol Buffers是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。(支持 Java、C++、Python 等多种语言,支持多个平台)
Protocol Buffers 是一种灵活,高效,自动化机制的结构数据序列化方法-可类比 XML,但是比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单。
你可以定义数据的结构,然后使用特殊生成的源代码轻松的在各种数据流中使用各种语言进行编写和读取结构数据。你甚至可以更新数据结构,而不破坏由旧数据结构编译的已部署程序。(可自定义,扩展性、兼容性好)
1.下载protobuf:
https://github.com/protocolbuffers/protobuf
2.生成protoc编译器
1、用终端切换到 protobuf 文件夹;
2、执行./autogen.sh ;
报错: ./autogen.sh: line 37: autoreconf: command not found
解决:
(1)autoconf 安装
curl -OL http://ftpmirror.gnu.org/autoconf/autoconf-2.69.tar.gz
tar -xzf autoconf-2.69.tar.gz
cd autoconf-2.69
./configure && make && sudo make install
(2)automake 安装
curl -OL http://ftpmirror.gnu.org/automake/automake-1.14.tar.gz
tar -xzf automake-1.14.tar.gz
cd automake-1.14
./configure && make && sudo make install
(3)libtool 安装
curl -OL http://ftpmirror.gnu.org/libtool/libtool-2.4.2.tar.gz
tar -xzf libtool-2.4.2.tar.gz
cd libtool-2.4.2
./configure && make && sudo make install
注意:解决完需再执行一遍./autogen.sh
3../configure
4.make
5.make check
6.sudo make install
7.objectivec/DevTools/full_mac_build.sh
工程中使用protobuf:
一、创建proto文件指定数据格式,可以选择proto2和proto3格式,它们有些细微的区别,在生成代码的时候会提示的,具体情况查看文档LanguageGuide proto3。下面使用proto3格式,并且保存为Person.proto。
创建文件person.proto
$ cd /Users/zhangzhe/Desktop
$ touch person.proto
然后用Xcode直接打开,写入:
syntax = "proto3";
message Person{
string name = 1;
int32 age = 20;
enum DeviceType{
iOS = 0;
Android = 1;
}
}
二、使用protoc工具生成Objective-C代码。其中--proto_path=后跟需要处理的proto文件所在的文件夹,--objc_out=指明生成的是Objective-C代码以及目标文件存放路径,最后是需要处理的文件。(objc_out表示生成oc下的文件)
protoc --proto_path=XXX --objc_out=ZZZ XXX/Person.proto
protoc --proto_path=MySrc --objc_out=MyGen MySrc/person.proto
三、处理完成后,生成两个文件,分别是Person.pbobjc.h和Person.pbobjc.m。这两个文件是采用的手动引用计数,因此在加入项目后需要设置它们的编译参数。
在工程target->Build Phrases->Compile Sources->给Person.pbobjc.m设置-fno-objc-arc
四、使用cocoapods方式导入:
使用 pod 'Protobuf’ ,推荐,但是有时候网络不好就...
或者静态库引入方式
1.下载Protocol Buffers的源代码
2.复制objectivec文件到工程里,Add files to 向项目加入ProtocolBuffers_iOS.xcodeproj子项目
3.设置依赖和连接库。
(1).工程target->General->Framework、Libiaries中添加libProtocolBuffers.a
(2)Target Dependencies
(3).工程target->Build Setting->Header Search Paths中添加 "$(SRCROOT)/protoBufTest/objectivec"
就可以使用了:
#import "Person.pbobjc.h"
Person *p = [[Person alloc] init];
p.name = @"";
p.age = 32;
NSData *data = [p data];