本文做者:丁同舟,来自金蝶随手记技术团队。php
本文接上篇《金蝶随手记团队分享:还在用JSON? Protobuf让数据传输更省更快(原理篇)》,以iOS端的Objective-C代码为例,向您演示如何使用Protobuf。html
学习交流:git
- 即时通信开发交流群:320837163[推荐]github
- 移动端IM开发入门文章:《新手入门一篇就够:从零开发移动端IM》objective-c
(本文同步发布于:http://www.52im.net/thread-1515-1-1.html)数据结构
本文是系列文章中的第2篇,总目录以下:架构
另外,若是您还打算系统地了解IM的开发知识,能够阅读《新手入门一篇就够:从零开发移动端IM》。学习
《一个基于Protocol Buffer的Java代码演示》
《强列建议将Protobuf做为你的即时通信应用数据传输格式》
《全方位评测:Protobuf性能到底有没有比JSON快5倍?》
《详解如何在NodeJS中使用Google的Protobuf》
>> 更多同类文章 ……
Protocol buffers为 Google 提出的一种跨平台、多语言支持且开源的序列化数据格式。相对于相似的 XML 和 JSON,Protocol buffers 更为小巧、快速和简单。其语法目前分为proto2和proto3两种格式。
目前 Google 官方的 Protobuf最新 release 版本为3.5.1,如下都是基于此版本的环境搭建。
关于 Protocol Buffer 的使用能够查阅官方文档:https://developers.google.com/protocol-buffers/docs/overview。
Objective-C 2.0 Runtime (32bit & 64bit iOS, 64bit OS X)
Xcode 7.0+
注意:
Protobuf 出于性能考虑没有使用 ARC,但在 ARC 下是可使用的。
下载 Protobuf 代码包(https://github.com/google/protobuf/releases),这里选择 protobuf-objectivec-3.5.1.tar.gz。
编译 Protobuf,这里可能须要安装部分工具:
$ brew install autoconf
$ brew install automake
$ brew install libtool
运行下面脚本进行编译:
$ ./autogen.sh
$ ./configure
$ make
$ makeinstall
检查protobuf是否安装成功:
$ protoc --version
若是成功打印版本号则安装成功:
libprotoc 3.5.1
这里使用官方文档上的一份示例数据结构建立Person.proto:
syntax = "proto3";
message Person {
string name = 1;
int32 id = 2;
string email = 3;
enumPhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
string number = 1;
PhoneType type = 2;
}
repeated PhoneNumber phone = 4;
}
使用命令行编译Person.proto为objective-c的文件,编译出来的文件为Person.pbobjc.h和Person.pbobjc.m:
protoc Person.proto --objc_out=./
Google 官方的文档提供了两种引入方式,但使用第一种的时候编译不能经过,因此这里选择了第二种:
复制protobuf目录下的:objectivec/*.h, objectivec/google/protobuf/*.pbobjc.h, objectivec/google/protobuf/*.pbobjc.m, 以及除去objectivec/GPBProtocolBuffers.m后的objectivec/*.m。
这里直接用命令行操做,首先进入protobuf下objectivec的目录:
$ cdprotobuf-3.5.1/objectivec
而后复制符合规则的文件到指定的工程目录下:
$mkdir~/ProtobufDemo/ProtocolBuffers~/ProtobufDemo/ProtocolBuffers/google~/ProtobufDemo/ProtocolBuffers/google/protobuf
$ cp*.h *.m ~/ProtobufDemo/ProtocolBuffers
$ cpgoogle/protobuf/*.pbobjc.h google/protobuf/*.pbobjc.m ~/ProtobufDemo/ProtocolBuffers/google/protobuf
注意:
上面的命令并无排除 GPBProtocolBuffers.m 文件,引入时须要手动排除。
如今把ProtocolBuffers目录下全部文件以及上面编译出来的Person.pbobjc.h和Person.pbobjc.m都引入到工程中。
如今工程目录结构大概是长这样:
须要注意,因为protobuf没有使用 ARC,所以须要为全部.m文件加上-fno-objc-arc来关闭 ARC:
注意:
须要注意工程中的 Header Search Paths 要增长 $(PROJECT_DIR)/ProtocolBuffers(具体的路径视状况而定)
若是以为手动引入文件的方式过于复杂,能够直接引入ProtocolBuffers工程做为依赖项:
1)进入解压后的protobuf目录下,复制objective目录下的全部文件到ProtobufDemo/ProtocolBuffers目录下;
2)在ProtobufDemo工程中引入ProtocolBuffers_iOS工程:
3)在Build Phases中加入依赖关系并连接库:
4)引入Person.pbobjc.h和Person.pbobjc.m文件并为.m加上-fno-objc-arc;
5)修改工程配置中部分路径为 $(PROJECT_DIR)/ProtocolBuffers。
首先引入头文件:
#import "Person.pbobjc.h"
生成Person对象并进行编码和解码:
Person *p = [[Person alloc] init];
p.id_p = 1;
p.name = @"person1";
p.email = @"123@qq.com";
//encode
NSData*data = [p data];
NSLog(@"Protocol Buffers:\n%@\nData: %@\nData Length: %lu", p, data, data.length);
//decode
Person *newP = [[Person alloc] initWithData:data error:nil];
NSLog(@"Decoded: %@", newP);
运行程序,打印日志以下:
Protocol Buffers:
: {
name: "person1"
id: 1
email: "123@qq.com"
}
Data: <0a077065 72736f6e 3110011a 0a313233 4071712e 636f6d>
Data Length: 23
Decoded: : {
name: "person1"
id: 1
email: "123@qq.com"
}
Coffee time!
(本文同步发布于:http://www.52im.net/thread-1515-1-1.html)