文档章节

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

啊子同
 啊子同
发布于 2016/11/14 15:03
字数 606
阅读 151
收藏 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
广州
程序员
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
0
0
Quick_Cocos2d_x V3.3 Protobuf Android

ios集成protobuf之后,调用pro.android/buildnative.sh 生成android工程的时候会出现 jni/../../Classes/AppDelegate.cpp:125: error: undefined reference to 'luaopenprotobufc' clang++:......

小房小田
2015/09/01
0
0
protobuf2.5在iOS上编译及cocos2dx混合使用的问题

项目代码里使用了protobuf作为协议层的的编码解码库, 所以需要编译成arm系列架构的静态库供游戏使用.在编译过程中十分坎坷,首先,protobuf的源码在编译时如果直接使用configure生成的makef...

pigsoldier
2014/02/28
0
0
unity中使用protobuffer作为网络通讯封包协议的实现和流程

一 使用的库 protobuffer 有两个c#实现,其中protobuffer-csharp 这个版本 比较适合跨语言开发,这个版本模仿java 实现;在ios上面,我们要使用 lite 版本,同时需要修改代码 却掉 pluginre...

李勇2
2015/02/28
0
0
cocos2dx 交叉编译 iconv库 protobuf库

cocos2dx提供三方的iconv来转化字符问题,交叉编译到android的时候,需要引入iconv的module,下载iconv, https://dl.dropbox.com/u/99895284/iconv.zip 解压到cocos2d根目录 ,编写mk: prot...

石头哥哥
2014/07/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring Cloud Gateway真的有那么差吗?

前言 Spring Cloud从一开始最受大家质疑的就是网关性能,那是由于Spring Cloud最初选择了使用Netflix几年前开源的Zuul作为基础,而高性能版的Zuul 2在经过了多次跳票之后,对于Spring这样的整...

Java小铺
46分钟前
1
0
SpringBoot远程调试,远程debug你的线上项目

开发环境中代码出错了,可以利用IDE的debug功能来进行调试。那线上环境出错呢? 一、假设我们的项目是部署在tomcat中,那我们就需要对tomcat进行一定对配置,配置如下。 1. windows系统中,找...

nonnetta
51分钟前
0
0
JAVA秒杀优化方向

秒杀优化方向 将请求尽量拦截在系统上游:传统秒杀系统之所以挂,请求都压倒了后端数据层,数据读写锁冲突严重,几乎所有请求都超时,流量虽大,下单成功的有效流量甚小,我们可以通过限流、...

小贱是个程序员
58分钟前
0
0
C# 统计字符串中大写字母和小写字母的个数

static void Main() { int count1 = 0; int count2 = 0; Console.WriteLine("请输入字符串"); string str = Convert.ToString(Consol......

熊二的爸爸是谁
今天
0
0
分布式服务框架之远程通讯技术及原理分析

在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等,这些名词之间到底是...

老道士
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部