金蝶隨手記團隊分享:還在用JSON? Protobuf讓數據傳輸更省更快(實戰篇)

本文做者:丁同舟,來自金蝶隨手記技術團隊。php

一、前言

本文接上篇《金蝶隨手記團隊分享:還在用JSON? Protobuf讓數據傳輸更省更快(原理篇)》,以iOS端的Objective-C代碼爲例,向您演示如何使用Protobuf。html

學習交流:git

- 即時通信開發交流羣:320837163[推薦]github

- 移動端IM開發入門文章:《新手入門一篇就夠:從零開發移動端IMobjective-c

(本文同步發佈於:http://www.52im.net/thread-1515-1-1.html數據結構

二、系列文章

本文是系列文章中的第2篇,總目錄以下:架構

金蝶隨手記團隊分享:還在用JSON? Protobuf讓數據傳輸更省更快(原理篇)工具

金蝶隨手記團隊分享:還在用JSON? Protobuf讓數據傳輸更省更快(實戰篇)》(本文)性能

另外,若是您還打算系統地瞭解IM的開發知識,能夠閱讀《新手入門一篇就夠:從零開發移動端IM》。學習

三、參考資料

Protobuf通訊協議詳解:代碼演示、詳細原理介紹等

一個基於Protocol Buffer的Java代碼演示

如何選擇即時通信應用的數據傳輸格式

強列建議將Protobuf做爲你的即時通信應用數據傳輸格式

全方位評測:Protobuf性能到底有沒有比JSON快5倍?

移動端IM開發須要面對的技術問題(含通訊協議選擇)

簡述移動端IM開發的那些坑:架構設計、通訊協議和客戶端

理論聯繫實際:一套典型的IM通訊協議設計詳解

詳解如何在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

五、準備工做

5.1 環境要求

Objective-C 2.0 Runtime (32bit & 64bit iOS, 64bit OS X)

Xcode 7.0+

注意:

Protobuf 出於性能考慮沒有使用 ARC,但在 ARC 下是可使用的。

5.2 安裝

下載 Protobuf 代碼包(https://github.com/google/protobuf/releases),這裏選擇 protobuf-objectivec-3.5.1.tar.gz。

5.3 解壓代碼包

編譯 Protobuf,這裏可能須要安裝部分工具:

$ brew install autoconf

$ brew install automake

$ brew install libtool

運行下面腳本進行編譯:

$ ./autogen.sh

$ ./configure

$ make

$ makeinstall

檢查protobuf是否安裝成功:

$ protoc --version

若是成功打印版本號則安裝成功:

libprotoc 3.5.1

六、在 iOS 中使用 Protobuf

6.1 建立.proto文件

這裏使用官方文檔上的一份示例數據結構建立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=./

6.2 引入 Protobuf 運行時資源

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(具體的路徑視狀況而定)

6.3 直接引入 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。

6.4 運行測試

首先引入頭文件:

#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

相關文章
相關標籤/搜索