新项目打算使用新的序列化数据结构协议,即Protobuf(Google)。之前网络通信和通用数据交换等应用场景中最常用的就是JSON和XML,Protobuf相较于两者,其效率、兼容性更为出色。
Protobuf(全称是Protocol Buffers)
定义和描述如下:
Protocol Buffers是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。(支持 Java、C++、Python 等多种语言,支持多个平台)
Protocol Buffers 是一种灵活,高效,自动化机制的结构数据序列化方法-可类比 XML,但是比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单。
你可以定义数据的结构,然后使用特殊生成的源代码轻松的在各种数据流中使用各种语言进行编写和读取结构数据。你甚至可以更新数据结构,而不破坏由旧数据结构编译的已部署程序。(可自定义,扩展性、兼容性好)
Protobuf环境搭建
其实就是安装一个Protobuf编译器,该工具可以将.proto文件转换成.m,.h文件。步骤如下:
1、打开终端,使用brew下载安装。可通过 $brew -v 查看是否安装了brew。
没有brew,则安装brew:$ ruby -e "$(curl -fsSLhttps://raw.githubusercontent.com/Homebrew/install/master/install)"
2、下载依赖库。
$ brew install automake
$ brew install libtool
3、下载protobuf
$ brew install protobuf
5、生成protoc编译器
cd到下载项目,执行以下命令
$ ./autogen.sh 生成configure (失败了。因为我没有翻墙,执行该脚本的网址是被墙了的!但是不影响protoc编译器生成)
$ ./configure
$ make
这一步我没有运行成功,但在终端发现protoc指令已经可以调用
$ protoc --version 查看是否安装成功
Protobuf使用
1、使用protoc生成oc文件
a.创建.proto文件,定义数据结构:
// 例1: 在 xxx.proto 文件中定义 Example1
syntax = "proto2"; //protobuf 的版本
message Example1 {
optional string stringVal = 1;
optional bytes bytesVal = 2;
message EmbeddedMessage {
int32 int32Val = 1;
string stringVal = 2;
}
optional EmbeddedMessage embeddedExample1 = 3;
repeated int32 repeatedInt32Val = 4;
repeated string repeatedStringVal = 5;
}
在上例中,我们定义了:
类型 string,名为 stringVal 的 optional 可选字段,字段编号为 1,此字段可出现 0 或 1 次
类型 bytes,名为 bytesVal 的 optional 可选字段,字段编号为 2,此字段可出现 0 或 1 次
类型 EmbeddedMessage(自定义的内嵌 message 类型),名为 embeddedExample1 的 optional 可选字段,字段编号为 3,此字段可出现 0 或 1 次
类型 int32,名为 repeatedInt32Val 的 repeated 可重复字段,字段编号为 4,此字段可出现 任意多次(包括 0)
类型 string,名为 repeatedStringVal 的 repeated 可重复字段,字段编号为 5,此字段可出现 任意多次(包括 0)
b.终端生成oc文件
$ protoc protoc --proto_path=A --objc_out=B person.proto A是存放.proto文件的文件夹路径 B是存放生oc文件的文件夹路径
2、直接将.h,.m文件导入项目工程中,这两个文件是采用的手动引用计数,因此在加入项目后需要设置它们的编译参数。在工程target->Build Phrases->Compile Sources->给Person.pbobjc.m设置-fno-objc-arc.
3、使用CocoaPods,将protobuf的解析代码导入到项目
pod 'protobuf'
以上完成后,工程开始使用这些数据类。
最后,来自深入 ProtoBuf - 简介中作者总结:
XML、JSON、ProtoBuf 都具有数据结构化和数据序列化的能力
XML、JSON 更注重数据结构化,关注人类可读性和语义表达能力。ProtoBuf 更注重数据序列化,关注效率、空间、速度,人类可读性差,语义表达能力不足(为保证极致的效率,会舍弃一部分元信息)
ProtoBuf 的应用场景更为明确,XML、JSON 的应用场景更为丰富。
参考资料:
3、 [翻译] ProtoBuf 官方文档(二)- 语法指引(proto2)