原文地址:http://blog.csdn.net/hyq4412/article/details/54891038

附加Homebrew安装地址:https://brew.sh/index_zh-cn.html

Protobuf简介

Protocol Buffer是google 的一种数据交换的格式,已经在Github开源,目前最新版本是3.1.0。它独立于语言,独立于平台。google 提供了多种语言的实现:Java、C#、C++、Go 和 Python,Objective-C,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比使用 XML 进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。

说明

  • protobuf3.0.0以上才官方支持Objective-C,低于3.0.0的请忽略或使用第三方转换工具
  • 开发环境:32bit & 64bit iOS, 64bit OS X,Xcode7.0+
  • 基于性能原因没有使用ARC,但可以被ARC代码调用

步骤

  1. 转换:将我们编写好的XXX.proto文件转成Objective C文件,也就是XXX.h和XXX.m文件,转换的工具是使用protoc这种二进制文件来生成的,这文件需要自己生成,稍后会介绍如何使用它来转换Objective-C文件
  2. 集成:如果在iOS项目中加入protobuf库以及步骤1生成的OC文件

转换

生成protoc

如果没有装autoconf automake libtool需要先装这几个,这里使用brew来安装,在shell执行 brew install autoconf automake libtool即可,如果没有brew请自行先安装brew。 
下载面向Objective-C的protobuf库,地址为(https://github.com/google/protobuf/releases),要下载对应Objective-C的版本比如 protobuf-objectivec-3.1.0.zip,解压。

cd到下载的目录,依次执行:

  • $ ./autogen.sh
  • $ ./configure
  • $ make
  • $ make check
  • $ sudo make install

再执行 
- objectivec/DevTools/full_mac_build.sh

执行完后会看到src目录下生成了protoc二进制文件

使用protoc转换

创建proto文件,比如Person.proto

syntax = "proto3";
message Person
{ int32 age = 1;string username = 2;string phone = 3;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

需要注意的是要指明proto的语法规则是proto2还是proto3。 
在src目录(protoc所在目录)执行

protoc --proto_path=... --objc_out=... XXX.proto
  • 1
  • 1

其中proto_path是我们创建的proto文件所在目录,objc_out为Objective-C文件输出路径,XXX.proto是我们创建的proto文件,可以一次转换多个proto文件,加在XXX.proto后面即可。

举例:我们在src目录下新建两个文件夹,gen和protocols文件夹,gen为输出目录,protocols用于存放proto文件,将创建的Person.proto放在protocols文件夹下,执行命令

protoc --proto_path=protocols --objc_out=gen protocols/Person.proto
  • 1
  • 1

然后在gen文件夹下就会生成Person.pbobjc.h和Person.pbobjc.m文件。

集成

将生成的Ojective-C文件(上面例子的Person.pbobjc.h和Person.pbobjc.m)放到项目中,如果项目使用了ARC,要将.m(例子的Person.pbobjc.m)的Complier Flags设为-fno-objc-arc。(protobuf基于性能原因没有使用ARC)

加入protobuf库,有两种方式

  • 第一种是使用CocoaPods集成

    • 使用CocoaPods集成,有一个现成的pod可以使用–Protobuf,可以pod search Protobuf搜索查看详情,pod内容为

      platform :ios, '7.1'
      pod 'Protobuf', '~> 3.1.0'
      • 1
      • 2
      • 1
      • 2

    需要注意的是 platform :iOS, ‘7.1’ 
    7.1及以上才能导入这个库,这种方式优点是操作简单,缺点是platform :ios, ‘7.1’ 要7.1或以上

  • 第二种是把相关文件拖入项目中。

    • 拖入相关文件到项目中,将objectivec文件夹下的所有的.h文件和.m文件(除了GPBProtocolBuffers.m)(GPB开头的那些文件)以及整个google文件夹add到项目中,如果项目中使用了ARC需要将以上所有.m文件的的Complier Flags设为-fno-objc-arc。这种方法的优点是灵活性强,没有7.1的束缚。缺点是操作麻烦点,如果用了ARC的话还要手动添加-fno-objc-arc(使用CocoaPods集成会自动添加),记得添加User Header Search Paths为$(PROJECT_DIR)/项目名/后接文件地址 不然头文件会报错

简单使用

直接上代码

- (void)viewDidLoad {
[super viewDidLoad];
Person *person = [[Person alloc] init];
person.age = 100;
person.username = @"huang";
person.phone = @"10086";
NSData *data = [person data];
Person *p = [Person parseFromData:data error:nil];
NSLog(@"person:%@",p);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

iOS 集成Protobuf,转换proto文件相关推荐

  1. Protobuf之proto文件编写规则

    一. 简单介绍 protobuf文件:就是定义你要的消息(类似java中的类)和消息中的各个字段及其数据类型(类似java类中的成员变量和他的数据类型) 二. Protobuf消息定义 1.消息由至少 ...

  2. pip 安装protobuf_Python3.6安装protobuf模块+将proto文件转换成pb2.py文件

    Python对版本的对应即为苛刻,笔者第一次安装时遇到了很多坑,比如无法将proto文件转换成py文件,转换了之后文件无法使用,网上各种各样的解决办法都没有讲到重点.其实会出现各种各样的问题是由于版本 ...

  3. Protobuf 学习(二)编译proto文件并测试

    Google 官网上的一个典型例子 (1)定义 proto 文件 // addressbook.protopackage tutorial; // package声明符message Person { ...

  4. Cocos Creator TypeScript 中使用ProtoBuf(利用工具把proto文件生成对应的js文件以及ts文件)

    我是一枚刚入坑cocos的小白o(╯□╰)o 开发环境:Cocos Creator 1.9   (需要安装Node.js,使用npm命令) 在网上找了很久都是讲的protobuf.js的用法,但是没有 ...

  5. protobuf教程(一)---引入其他proto文件

    本章主要介绍了如何在 proto 文件中引入其他 proto 文件. 1. 概述 Protocol buffers 是一种语言无关.平台无关的可扩展机制或者说是数据交换格式,用于序列化结构化数据.与 ...

  6. 【Protobuf速成指南】.proto文件的编写与编译

    文章目录 1.0版本 一.编写.proto文件 1.文件规范: 2.注释方式: 3.指定proto3语法: 4.package申明符 5.定义message 6.编写消息字段 ①类型对照表 ②唯一编号 ...

  7. Linux下利用protoc命令生成protobuf的头文件和源文件,根据mesType.proto文件

    Linux下利用protoc命令生成protobuf的头文件和源文件,根据mesType.proto文件 protobuf的message文件为 msgType.proto 生成c++头文件和源文件的 ...

  8. protobuf引入不同包下的proto文件

    解决两个问题: 1.两个proto文件存放路径不同 2.两个proto的package不同 比如现在有个RankInfoRes.proto文件,它的package是: com.road.ddt.pro ...

  9. Protobuf —— .proto文件详解

    说明      proto文件扩展名称为".proto",可以使用import包含另一个.proto文件.   字段限制      required -- 必须赋值的字符      ...

最新文章

  1. Scala标识符的命名规范
  2. Felx布局基础教程
  3. LeetCode-Spiral Matrix-螺旋矩阵
  4. haskell程序设计语言
  5. iOS最为简单时间轴(GZTimeLine)
  6. 麦克风阵列技术 一 (名词解释 背景介绍 麦克风及音频信号 麦克风阵列简介)
  7. meta分析零基础教程-Prospero选题注册全流程
  8. [translate]Multimodal Self-Paced Learning for Multi-Omics Feature Selection and Data Integration
  9. 怎样建自己的网站?如何建立一个网站?建网站的步骤?
  10. 给定a和n,计算a+aa+aaa+aaaa+...+a...a(n个a) 的和
  11. 百度地图、高德地图、腾讯地图餐饮POI内容结构及获取接口
  12. 上海市计算机学会-买二送一
  13. SQL Server 如何判断PLE (页面的预期寿命)
  14. Emscripten中的虚拟文件系统
  15. 浅析去中心化的商业积分体系
  16. 不可不学的摄影技巧之一(构图)
  17. Qt pro的一些小用法(qmake)
  18. JavaScript基本数据类型以及内存分配
  19. 秦岭土蜂蜜价格 秦岭土蜂蜜多少钱一斤
  20. ipa文件反编译_手把手教你反编译别人的app

热门文章

  1. 计算机组成原理王道笔记——基础知识
  2. Java语言平台的三大版本
  3. Nginx报错 HTTP 413 Request Entity Too Large(Payload Too Large)解决方案
  4. Pandas 进阶知识学习
  5. 从头再来安装anaconda3(ubuntu 18.04 TSL)我又来了!!!
  6. 《Computer Knowledge And Technology》 Vol.9 No.35 December2013 / CONTENTS
  7. Mac下配置Docker Kitematic使用Proxy加速镜像下载Swift Kitura镜像
  8. 基于MFC的纸牌游戏
  9. 根据经纬度点计算区域面积
  10. Jmeter-token获取方法