https://blog.csdn.net/dangbai01_/article/details/81099001

(1)Protobuf是什么?

Protobuf 即 google protocol buffer 是一种数据封装格式协议,是google推出

的一种语言无关、平台无关、扩展性好的用于通信协议、数据存储的结构化数据串行化方法。支持

C++、Python、Java三种语言。

(2)为什么要使用Protobuf?

在不同平台通信的时候,首先需要将对象进行序列化。iOS平台上我们常用NSKeyedArchiver进行

归档,当然也可以将数据处理为JSON或者XML格式。NSKeyedArchiver只能在iOS/Mac平台使用,

因此它归档的二进制数据不适合于在不同平台之间使用。JSON和XML虽然由于容易维护,易读而应用

比较广泛,但是对数据的利用效率都不是高。这时候该使用Protobuf了,因为Protobuf的优势是

效率高,同样的一份数据使用protobuf存储的时候更小,更加方便

(3)安装步骤如下:

一.安装环境

Pre:做这些事情的时候例行FQ

1.打开终端

2.查看你的mac上是否安装了brew

$ brew -v

Homebrew 1.6.8

Homebrew/homebrew-core (git revision d822; last commit 2018-06-12)

这是表明已经安装,如果没有安装,使用下面的命令安装下

3.安装brew (使用ruby安装)

$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/

Homebrew/install/master/install)"

4.下载依赖库(工具)

$ brew install automake

$ brew install libtool

5.下载Protobuf,这些执行之后后边pod才能成功

$ brew install protobuf

6.克隆protobuf-objc,也就是说把代码下载到本地

方法一:

$ cd desktop 我是clone到桌面,你们可以随便放那

$ git clone https://github.com/alexeyxo/protobuf-objc.git

方法二:我用的这种方法

上边的方法如果没有成功,可以到官方网址下载https://github.com/google/protobuf/releases

我下的版本是3.6.0,放在了桌面上

7.运行脚本

$  cd  Desktop

$  cd protobuf-3.6.0 切换到protobuf-3.6.0目录下

方法一:

$  ./scripts/build.sh

方法二:我用的这种方法

$ ./autogen.sh

$ ./configure

$ make

# 如果希望安装protoc,执行下面的命令

$ make install

如果例行FQ好像没有出现错误,如果出现这样的错误,不要慌,这是google自己版本的问题,我们不用管他,而且也不会像其他文章说的那

样,生成protoc-gen-objc这个插件,根本就不会生成,除非版本是2.6.0,这个问题采用下面的方式一样能生成proto文件

编译后报错:In file included from objc_helpers.cc:27:./google/protobuf/

objectivec-descriptor.pb.h:17:2: error: This file was generated by

an older version of protoc which is

#error This file was generated by an older version of protoc which is

^

./google/protobuf/objectivec-descriptor.pb.h:18:2: error: incompatible with your

Protocol Buffer headers. Please

#error incompatible with your Protocol Buffer headers. Please

^

./google/protobuf/objectivec-descriptor.pb.h:19:2: error: regenerate this file

with a newer version of protoc.

#error regenerate this file with a newer version of proton.

......

二.生成后缀proto的文件

说明: 创建 proto 文件指定数据格式,可以选择proto2和proto3格式,它们有些细微的区别,在生成代码的时候会提示的,具体情况查看文档Language Guide proto3。下面使用proto3格式,并且保存为person.proto。

1.  创建文件person.proto

$  cd desktop  我还是切换到桌面

$  touch person.proto

2. 编辑person.proto文件

2.1 使用终端编辑

$ vi person.proto

syntax = "proto3";

message Person{

string name = 1;

int32 age = 20;

enum DeviceType{

iOS = 0;

Android = 1;

}

}

2.2 放到xcode中直接写(推荐)

三.转化成objc文件

由于我们生成不了protoc-gen-objc,因此使用

protoc --plugin=/usr/local/bin/protoc-gen-objc  --objc_out=./ person.proto

使用绝对路径是不行的

我们使用 protoc 工具生成Objective-C代码:

终端输入: $ protoc --proto_path=A --objc_out=B person.proto

其中--proto_path=后跟A是需要处理的proto文件所在的文件夹,--objc_out=指明生成的是Objective-C代码以及目标文件存放路径,B是目标文件存放路径,person.proto是需要处理的文件。

So:

我的做法是在桌面上建立两个文件夹,一个叫protofile,一个叫objcfile

然后将创建好的person.proto放进protofile文件夹,然后

cd Desktop

在终端输入:

protoc --proto_path=protofile --objc_out=objecfile person.proto

然后成功在objcfile里得到我们要的 文件

导入工程中,这两个文件是采用的手动引用计数,因此在加入项目后需要设置它们的编译参数。

在工程target->Build Phrases->Compile Sources->给Person.pbobjc.m设置-fno-objc-arc.

设置

四.项目使用 (下载Protocol Buffers的源码(下载地址),也可以到官网上下载)

1.使用cocoapods方式导入:我使用的是这种方法

使用 pod  'Protobuf’

不能使用 pod 'ProtocolBuffers’,

使用 pod ‘ProtocolBuffers’的话:

下载成功之后,编译一看,结果报错

#import "GPBProtocolBuffers_RuntimeSupport.h"无法找到

原因是pods下来的是不带GPB的,所以网上说的不对,应该是用

pod 'Protobuf' ,这样就没有问题

2.静态库引入方式

1.下载Protocol Buffers的源代码

2.工程里引入ProtocolBuffers_iOS.xcodeproj,或者编译成静态库.a方式,然后公开头文件(如图2)

3.设置依赖和连接库。(如图3)

4.引入头文件(如图4)

图2

图3

图4

五、具体使用和对比

设置依赖和连接库。

引入头文件开始使用。

#import "Person.pbobjc.h"

- (void)viewDidLoad {

[super viewDidLoad];

Person *person = [[Person alloc] init];

person.name = @“qiao”;

person.age = 18;

NSData *data = [person data];

NSLog(@"\nname:%@,age:%d", p.name, p.age);

}

打印结果如下:

2015-12-02 13:09:46.890 ProtobufDemo[34761:150533]

name:qiao,age:18

Protocol Buffer效率测试 我们这里说的效率是指空间占用率。简单和JSON格式比较一下,同样是存储下面的信息:

name: qiao

age:16

采用Protocol Buffers的数据大小为20个字节。而实用JSON存储时,尽管我们将Key变成一个字节,如下:

NSDictionary *dict = @{@"n":@“qiao",

@“a":@“18",

};

NSData *jd = [NSJSONSerialization dataWithJSONObject:dict options:0 error:nil];

NSLog(@"jd: %lu", jd.length);

JSON数据还是占了36个字节,并且随着可读性提高,效率更低。XML就更不用说了。

总结

如果希望获得更好的的可读性,可以选用JSON和XML这类文本格式。但如果从数据效率上将,Protocol Buffer是一个不错的选择。存储效率高,并且proto文件的可读性和可维护性都比较强。

POST:

https://blog.csdn.net/diveinedu/article/details/50203033

https://www.jianshu.com/p/189368a9d744

https://blog.csdn.net/u014337888/article/details/78907625
---------------------
作者:当白
来源:CSDN
原文:https://blog.csdn.net/dangbai01_/article/details/81099001
版权声明:本文为博主原创文章,转载请附上博文链接!

ios之库Protobuf的使用的更多相关文章

  1. iOS 第三方库、插件、知名博客总结

    iOS 第三方库.插件.知名博客总结 用到的组件 1.通过CocoaPods安装 项目名称 项目信息 AFNetworking 网络请求组件 FMDB 本地数据库组件 SDWebImage 多个缩略图 ...

  2. iOS - 静态库的创建与使用

    在日常项目开发中,不论是为了两个公司项目上的业务交流还是为了减少项目的编译时间,有的时候我们会把项目中的私密内容打包成静态库,或者是把项目中变动较少一部分打包成静态库以便提高编译效率,那么下面我们就来 ...

  3. IOS静态库

    如何在Xcode中创建C++静态库 http://jingyan.baidu.com/article/03b2f78c111fca5ea237ae26.html iOS 如何创建和使用静态库 http ...

  4. 快快快!27个提升效率的iOS开源库推荐

    文章来源:http://www.csdn.net/article/2015-07-21/2825264-27-ios-open-source-libraries/1 我热爱开源,更喜爱那些花费宝贵的业 ...

  5. 封装ios静态库碰到的一些问题(一)

    封装IOS动态库,碰到的第一个问题,就是资源文件的问题,如果将你的程序封装成为静态库,那么静态库中不会包含资源文件和xib文件,这个时候就需要自己封装bundle文件了,而笔者开发环境默认是xcode ...

  6. fir.im Weekly - 热门 iOS 第三方库大盘点

    本期 fir.im Weekly 收集的热度资源,大部分关于Android.iOS 开发工具.源码和脑洞大开的 UI 动画,希望给你带来更多的工作创意与灵感. 盘点国内程序员不常用的热门iOS第三方库 ...

  7. iOS静态库.a文件制作和导入使用

    iOS静态库.a文件制作: 1.新建Cocoa Touch Static Library工程 新建工程 - 选择iOS-FrameWork&Libary,选择 Cocoa Touch Stat ...

  8. MTNET 自用ios网络库开源

    短短两天就在https://git.oschina.net/gangwang/MTNET这里收获15个星 github 5星, 值得收藏! MTNET 自用ios网络库开源, 自用很久了,在数歀上架的 ...

  9. 27个提升效率的iOS开源库推荐

    DZNEmptyDataSet(UI,空表格视图解算器) PDTSimpleCalendar(UI,drop-in日历组件) MagicalRecord(实施活跃记录模式的Core Data助手) C ...

随机推荐

  1. 升级node版本

    一.升级方法: 1.产看node版本,没安装的请先安装: $ node -v 2.清楚node缓存: $ sudo npm cache clean -f 3.安装node版本管理工具'n'; $ su ...

  2. C# 中的Async 和 Await 的用法详解

    众所周知C#提供Async和Await关键字来实现异步编程.在本文中,我们将共同探讨并介绍什么是Async 和 Await,以及如何在C#中使用Async 和 Await. 同样本文的内容也大多是翻译 ...

  3. 合肥.NET技术社区首次线下聚会全程回顾【多图】

    2019年3月16日对于合肥.NET来说是一个特别的日子,因为这是合肥.NET技术社区首次非正式线下聚会!这次聚会受场地限制(毕竟是聚餐的形式),即使换成了小椅子后,最多也只能容纳24个人,所以还有一 ...

  4. CanalSharp-mysql数据库binlog的增量订阅&消费组件Canal的.NET客户端

    一.前言 CanalSharp是阿里巴巴开源项目mysql数据库binlog的增量订阅&消费组件 Canal 的.NET客户端,关于什么是 Canal?又能做什么?我会在后文为大家一一介绍.C ...

  5. DotNetCore跨平台~EFCore废弃了TransactionScope取而代之的Context.Database.BeginTransaction

    回到目录 TransactionScope是.net平台基于的分布式事务组件,它默认为本地事务,同时当系统有需要时可以自动提升为分布式事务,而对系统的前提是要开启MSDTC服务,必要时需要在数据库服务 ...

  6. asp.net core系列 30 EF管理数据库架构--必备知识 迁移

    一.管理数据库架构概述 EF Core 提供两种主要方法来保持 EF Core 模型和数据库架构同步.一是以 EF Core 模型为基准,二是以数据库为基准. (1)如果希望以 EF Core 模型为 ...

  7. js动态生成层方法 不懂得加QQ 2270312758

    我们在WEB开发时,很多时候往往需要我们 JavaScript 来动态建立 html 元素,动态的设置相关的属性.比方说我们想要建立一个 div 层,则可以使用以下代码实现.一.直接建立 functi ...

  8. 【译】使用 LINQ 合并 IEnumerable 序列

    Zip 方法允许把序列中的元素通过交织将 IEnumerable 序列连接在一起.Zip 是一种基于 IEnumerable 的扩展方法.例如,将具有年龄的名称集合压缩在一起: var names = ...

  9. Java学习点滴——Integer缓存

    前言 一切从下面这段代码开始 public static void test(String[] agrs){ Integer a = 1; Integer b = 2; System.out.prin ...

  10. ServiceStack.Redis 请求次数6000次异常

    Redis是一个非常NB的内存级的数据库,我们可以把很多”热数据“(即读写非常多的数据)放入其中来操作,这样就减少了和关系型数据库(如SqlServer/My Sql等)之间的交互,程序的响应速度也大 ...