美文网首页即时通讯技术研究Android开发探索程序员
金蝶随手记团队分享:还在用JSON? Protobuf让数据传输

金蝶随手记团队分享:还在用JSON? Protobuf让数据传输

作者: JackJiang2011 | 来源:发表于2018-04-03 11:22 被阅读304次

    本文作者:丁同舟,来自金蝶随手记技术团队。

    1、前言

    本文接上篇《金蝶随手记团队分享:还在用JSON? Protobuf让数据传输更省更快(原理篇)》,以iOS端的Objective-C代码为例,向您演示如何使用Protobuf。

    学习交流:

    - 即时通讯开发交流群:320837163[推荐]

    - 移动端IM开发入门文章:《新手入门一篇就够:从零开发移动端IM

    (本文同步发布于:http://www.52im.net/thread-1515-1-1.html

    2、系列文章

    本文是系列文章中的第2篇,总目录如下:

    金蝶随手记团队分享:还在用JSON? Protobuf让数据传输更省更快(原理篇)

    金蝶随手记团队分享:还在用JSON? Protobuf让数据传输更省更快(实战篇)》(本文)

    另外,如果您还打算系统地了解IM的开发知识,可以阅读《新手入门一篇就够:从零开发移动端IM》。

    3、参考资料

    Protobuf通信协议详解:代码演示、详细原理介绍等

    一个基于Protocol Buffer的Java代码演示

    如何选择即时通讯应用的数据传输格式

    强列建议将Protobuf作为你的即时通讯应用数据传输格式

    全方位评测:Protobuf性能到底有没有比JSON快5倍?

    移动端IM开发需要面对的技术问题(含通信协议选择)

    简述移动端IM开发的那些坑:架构设计、通信协议和客户端

    理论联系实际:一套典型的IM通信协议设计详解

    详解如何在NodeJS中使用Google的Protobuf

    >> 更多同类文章 ……

    4、基本介绍

    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、准备工作

    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

    6、在 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

    相关文章

      网友评论

        本文标题:金蝶随手记团队分享:还在用JSON? Protobuf让数据传输

        本文链接:https://www.haomeiwen.com/subject/nteqhftx.html