文档章节

protocolbuffers应用在iOS的配置以及使用方法

啊子同
 啊子同
发布于 2016/11/14 15:03
字数 606
阅读 385
收藏 0

#程序员薪资揭榜#你做程序员几年了?月薪多少?发量还在么?>>>

Protocol Buffers 是 Google 出品的用来序列化/反序列化数据的工具。原生支持 C++、Java、Python。

如果要在 iOS 上使用 PB,可以直接使用 C++,但是编译过程很麻烦,因此这里使用的是第三方的库。

安装 Protocol Buffers

  • 安装 homebrew
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  • 安装 automake、libtool、protobuf。这里安装的 protobuf 是 google 官方版本。
brew install automake
brew install libtool
brew install protobuf
  • 先下载protocolbuffer的源码 protocolbuffer 。里面有ios的部分,可以编译成framework的动态库或静态库,我做好一个demo,可以用现成的,见github demo
  • 安装protocolbuffer,protol类成成工具,一种办法是用上述源码里。
$ cd compiler
$ ./autogen.sh
$ ./configure
$ make
$ make install (optional)

 

  • 编译 protoc-gen-objc。protoc-gen-objc 是 protoc 的一个插件,使其能将 .proto 文件编译成 objective-c 代码。
git clone git@github.com:alexeyxo/protobuf-objc.git

cd protobuf-objc

./autogen.sh

# 后面的参数保证 configure 能找到 protobuf 相关的头文件和库
# 避免报 protobuf headers are required 错误
./configure CXXFLAGS=-I/usr/local/include LDFLAGS=-L/usr/local/lib

make

make install

若make后编译不通过,报错如下:

    google/protobuf/message.cc:130:60: error: implicit instantiation of undefined template  
          'std::__1::basic_istream<char, std::__1::char_traits<char> >'  
      return ParseFromZeroCopyStream(&zero_copy_input) && input->eof();  
                                                               ^  
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/iosfwd:109:33: note:   
          template is declared here  
        class _LIBCPP_TYPE_VIS_ONLY basic_istream;  
                                    ^  
    google/protobuf/message.cc:135:67: error: implicit instantiation of undefined template  
          'std::__1::basic_istream<char, std::__1::char_traits<char> >'  
      return ParsePartialFromZeroCopyStream(&zero_copy_input) && input->eof();  
                                                                      ^  
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/iosfwd:109:33: note:   
          template is declared here  
        class _LIBCPP_TYPE_VIS_ONLY basic_istream;  
                                    ^  
    google/protobuf/message.cc:175:16: error: implicit instantiation of undefined template  
          'std::__1::basic_ostream<char, std::__1::char_traits<char> >'  
      return output->good();  
                   ^  
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/iosfwd:111:33: note:   
          template is declared here  
        class _LIBCPP_TYPE_VIS_ONLY basic_ostream;  
                                    ^  
    3 errors generated.  
    make[2]: *** [message.lo] Error 1  
    make[1]: *** [all-recursive] Error 1  
    make: *** [all] Error 2  

根据错误信息,对报错的文件进行如下修改:

protobuf-2.4.1/src/google/protobuf/message.cc,添加#include<istream>

添加后make成功。make install,安装到自定义目录。

这些完成之后,写一个protoc文件测试: UserInfo.proto

enum UserStatus {
    OFFLINE = 0;
    ONLINE = 1;
}
message UserInfo {
    required int64 acctID = 1;
    required string name = 2;
    required UserStatus status = 3;
}

转换:

$protoc --objc_out=. UserInfo.proto

在当前目录出现两个文件: UserInfo.pb.h UserInfo.pb.m

在 Podfile 中添加 pod 'ProtocolBuffers', '1.9.2' 然后执行 pod install

生成完成,使用起来很方便,导入framework静态库到工程中,使用方法:

UserInfoBuilder* builder = [UserInfo builder];
[builder setName:@"zhangsan"];
[builder setAcctId:1000];
[builder setStatus:UserStatusOnline];

UserInfo* info1 = [builder build];
NSData* data = info1.data;
NSLog(@"data:%@", data);


//data->obj

UserInfo* info2 = [UserInfo parseFromData:data];
NSLog(@"obj:%@", info2);

© 著作权归作者所有

啊子同
粉丝 0
博文 46
码字总数 10556
作品 0
广州
程序员
私信 提问
加载中

评论(0)

TeamTalk项目iOS端代码总结

前段时间加入一个团队,对TeamTalk进行二次开发。我负责iOS端的功能扩展。这个项目目前已少有人维护,iOS端在我接手后进行了一些底层改动,现介绍给大家。 TeamTalk是一个很有名气的即时通讯...

yige2002
2018/09/08
0
0
iOS 集成Protobuf,转换proto文件

原文地址:http://blog.csdn.net/hyq4412/article/details/54891038 附加Homebrew安装地址:https://brew.sh/index_zh-cn.html Protobuf简介 Protocol Buffer是google 的一种数据交换的格式,......

osc_c4olampb
2018/02/02
4
0
TensorFlow给机器学习在移动端的运用

人工智能、机器学习都已走进了我们的日常,尤其是愈演愈热的大数据更是跟我们的生活息息相关,做 人工智能、数据挖掘的人在其他人眼中感觉是很高大上的,总有一种遥不可及的感觉,在我司也经...

程序猿拿Q
2018/11/02
49
0
ios之库Protobuf的使用

https://blog.csdn.net/dangbai01_/article/details/81099001 (1)Protobuf是什么? Protobuf 即 google protocol buffer 是一种数据封装格式协议,是google推出 的一种语言无关、平台无关、扩展...

osc_0tk7cpde
2019/04/22
6
0
google protocol buffer (C++,Java序列化使用实例)

1.下载安装: google protocol buffer 的官网地址是:http://code.google.com/p/protobuf/ 建议下载稳定版本:protobuf-2.4.1 linux下载protobuf-2.4.1.tar.bz2 windows下载protobuf-2.4.1.zip ......

hanzhankang
2014/03/03
2K
0

没有更多内容

加载失败,请刷新页面

加载更多

时间片轮询法

时间片轮询法 时间片轮询法是一种比较简单易用的系统架构之一,它对于系统中的任务调度算法是分时处理。核心思路是把 CPU 的时间分时给各个任务使用。我们常用的定时方法是定时器,把调度器放...

osc_j7rfhwi0
刚刚
0
0
二项堆(三)之 Java的实现

概要 前面分别通过C和C++实现了二项堆,本章给出二项堆的Java版本。还是那句老话,三种实现的原理一样,择其一了解即可。 目录 1. 二项树的介绍 2. 二项堆的介绍 3. 二项堆的基本操作 4. 二项...

osc_ct8a6sdg
刚刚
0
0
Windows 10 安装 Hadoop 2.10

  1. 配置JAVA_HOME环境和Hadoop环境:      2. 配置bin   3. 进入Hadoop中/etc/hadoop下     配置hdfs-site.xml增加:    <property> <!-- 单节点,所以配置成1 -->...

osc_jmtenr3d
1分钟前
10
0
如何让你在众多二手车中挑中满意的?python帮你实现(附源码)

前言 老司机带你去看车,网上的几千条的二手车数据,只需几十行代码,就可以统统获取,保存数据到我们本地电脑上 知识点: 1.python基础知识 2.函数 3.requests库 4.xpath适合零基础的同学 ...

osc_rmqoxylv
2分钟前
6
0
Selenium IDE使用指南三(控制流)

Selenium IDE附带的命令使您可以添加条件逻辑和循环到测试中。 这使您仅在满足应用程序中的某些条件时才执行命令(或一组命令),或根据预定义的标准重复执行命令。 JavaScript表达式 通过使...

分布式编程
2分钟前
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部