原文地址: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. Python3.6安装protobuf模块+将proto文件转换成pb2.py文件

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

  2. 【protobuf进阶】通过.proto文件导出C#支持的.cs类文件

    protobuf是一个跨平台的消息交互协议,类似xml.json等. protocolbuffer(以下简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台.google 提供了多 ...

  3. Protocol Buffer使用转换工具将proto文件转换成Java文件流程及使用

    Client与Server的网络通信协议传输使用google protobuf,服务器端使用的是Java 一. Protocol Buffersprotobuf全称Google Protocol Bu ...

  4. Protobuf - 使用scons编译proto文件

    使用protobuf过程中,需要先对消息结构进行定义,文件以.proto格式结尾.然后要使用google提供的protoc命令行,把.proto文件转成对应的代码文件. protoc --proto_ ...

  5. 解决proto文件转换时提示“Note that enum values use C++ scoping rules, meaning that enum values are siblings of their type, not children of it. ”

    前言: 想将.proto文件转换成.pb文件时一直报错,一开始以为是文件编码格式的问题,后来将文件改成windows下的utf-8格式后,又出现了新的报错(见下图).百度了很久,才找到解决方法. &q ...

  6. Protobuf 动态加载 .proto 文件并操作 Message

    Google Protocol Buffer 的常规用法需要使用 protoc 将 .proto 编译成 .pb.h 和 .pb.cc,这样做效率非常高,但是耦合性也很高.在某些追求通用性而不追求性能 ...

  7. Google Protocol Buffer的安装与.proto文件的定义

    什么是protocol Buffer呢? Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准. 我理解的就是:它是一种轻便高效的结构 ...

  8. cocos2dx 3.x 集成protobuf

    vs2013+cocos2dx 3.13.1 这篇博文是集成Lua版本的protobuf,集成C++版本的过程也可参考. 主要参考博文地址<cocos2dx 3.x C++搭建protobuf环 ...

  9. Google Protocol Buffer的安装与.proto文件的定义(转)

    转自(https://www.cnblogs.com/yinheyi/p/6080244.html) 什么是protocol Buffer呢? Google Protocol Buffer( 简称 P ...

随机推荐

  1. bzoj1570: [JSOI2008]Blue Mary的旅行(二分+网络流)

    1570: [JSOI2008]Blue Mary的旅行 题目:传送门 题解: get到拆点新姿势,还是做题太少了...ORZ 因为每天就只能有一个航班,那就不能直接连了,所以要拆点(然后就被卡住了) ...

  2. ThinkPHP5.0框架开发--第4章 TP5.0路由

    ThinkPHP5.0框架开发--第4章 TP5.0路由 第4章 TP5.0 路由 ================================================== 上次复习 1. ...

  3. [AH2017/HNOI2017] 礼物 解题报告 (FFT)

    题目链接: https://www.luogu.org/problemnew/show/P3723 题目: 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手环,一个留给自 ...

  4. [JZOJ NOIP2018模拟10.21]

    考试之前我刚刚领略到了特判的重要性,没想到T2的两个子任务还是写挂了,丢了20分 考试的感觉不行,一路打的都是暴力,正解的思路想到一半就断了推不下去 T1:逛公园 题目链接: https://jzoj ...

  5. 为什么不针对internal接口写单元测试?

    测试驱动的开发(TDD,Test Driven Development)的核心理念,是要使得重构(refactoring)更为有效,而不是创建更多的测试. 对一个有着长生命周期的项目来讲,在它的第一个 ...

  6. (转载) android快速搭建项目积累

    android快速搭建项目积累 2016-04-05 20:07 519人阅读 评论(0) 收藏 举报  分类: android优化(8)   Rx技术(5)  版权声明:本文为博主原创文章,未经博主 ...

  7. (转载)PopuWindow和软键盘共存时的设置

    PopuWindow和软键盘共存时的设置 收藏 artshell 发表于 2年前 阅读 1499 收藏 10 点赞 2 评论 0 腾讯云上实验室 1小时搭建人工智能应用 让技术更容易入门>> ...

  8. Android 开发环境安装配置手册

    本文指导,如何一步步搭建Android开发平台. 1  下载软件 n JDK 1.5+   到  http://java.sun.com/javase/downloads/index.jsp 下载 n ...

  9. EFcore笔记之创建模型

    排除属性:NotMapped NotMapped:排除属性在CodeFirst的时候在数据库里不创建该属性   public class Blog { public int BlogId { get; ...

  10. python 模块一览

    一个模块可以对应一个文件 同一个模块,可以import多次,但只会被导入一次 模块的导入顺序 导入模块写在文件最上面 自己写的和内置的以及扩展的分开 顺序:内置,扩展,自己写的 按字母大小写排序 一行 ...