歡迎關注微信公衆號「隨手記技術團隊」,查看更多隨手記團隊的技術文章。轉載請註明出處
本文做者:丁同舟
原文連接:mp.weixin.qq.com/s/y0dyK47_s…git
因爲隨手記客戶端與服務端交互的過程當中,對部分數據的傳輸大小和效率有較高的要求,普通的數據格式如 JSON 或者 XML 已經不能知足,所以決定採用 Google 推出的 Protocol Buffers 以達到數據高效傳輸。github
Protocol buffers 爲 Google 提出的一種跨平臺、多語言支持且開源的序列化數據格式。相對於相似的 XML 和 JSON,Protocol buffers 更爲小巧、快速和簡單。其語法目前分爲proto2
和proto3
兩種格式。objective-c
目前 Google 官方的 Protobuf 最新 release 版本爲3.5.1,如下都是基於此版本的環境搭建。shell
關於 Protocol Buffer 的使用能夠查閱官方文檔c#
Notebash
Protobuf 出於性能考慮沒有使用 ARC,但在 ARC 下是可使用的微信
下載 Protobuf 代碼包,這裏選擇 protobuf-objectivec-3.5.1.tar.gz
數據結構
解壓代碼包工具
編譯 Protobuf,這裏可能須要安裝部分工具:性能
$ brew install autoconf
$ brew install automake
$ brew install libtool
複製代碼
$ ./autogen.sh
$ ./configure
$ make
$ make install
複製代碼
protobuf
是否安裝成功$ protoc --version
複製代碼
若是成功打印版本號則安裝成功
libprotoc 3.5.1
複製代碼
這裏使用官方文檔上的一份示例數據結構建立Person.proto
syntax = "proto3";
message Person {
string name = 1;
int32 id = 2;
string email = 3;
enum PhoneType {
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
的目錄:
$ cd protobuf-3.5.1/objectivec
複製代碼
而後複製符合規則的文件到指定的工程目錄下:
$ mkdir ~/ProtobufDemo/ProtocolBuffers ~/ProtobufDemo/ProtocolBuffers/google ~/ProtobufDemo/ProtocolBuffers/google/protobuf
$ cp *.h *.m ~/ProtobufDemo/ProtocolBuffers
$ cp google/protobuf/*.pbobjc.h google/protobuf/*.pbobjc.m ~/ProtobufDemo/ProtocolBuffers/google/protobuf
複製代碼
Note
上面的命令並無排除 GPBProtocolBuffers.m 文件,引入時須要手動排除
如今把ProtocolBuffers
目錄下全部文件以及上面編譯出來的Person.pbobjc.h
和Person.pbobjc.m
都引入到工程中
如今工程目錄結構大概是長這樣
須要注意,因爲protobuf
沒有使用 ARC,所以須要爲全部.m
文件加上-fno-objc-arc
來關閉 ARC
Note
須要注意工程中的 Header Search Paths 要增長
$(PROJECT_DIR)/ProtocolBuffers
(具體的路徑視狀況而定)
若是以爲手動引入文件的方式過於複雜,能夠直接引入ProtocolBuffers
工程做爲依賴項
進入解壓後的protobuf
目錄下,複製objective
目錄下的全部文件到ProtobufDemo/ProtocolBuffers
目錄下
在ProtobufDemo
工程中引入ProtocolBuffers_iOS
工程
在Build Phases
中加入依賴關係並連接庫
引入Person.pbobjc.h
和Person.pbobjc.m
文件併爲.m
加上-fno-objc-arc
修改工程配置中部分路徑爲 $(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:
<Person 0x60c0000da2b0>: {
name: "person1"
id: 1
email: "123@qq.com"
}
Data: <0a077065 72736f6e 3110011a 0a313233 4071712e 636f6d>
Data Length: 23
Decoded: <Person 0x6040000d9c90>: {
name: "person1"
id: 1
email: "123@qq.com"
}
複製代碼
Coffee time!