类似于xml的一种数据传输格式protobuf

Posted 一米王子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类似于xml的一种数据传输格式protobuf相关的知识,希望对你有一定的参考价值。

1、Protobuf 简介

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

2、Protobuf的转换

就是将我们编写好的XXX.proto文件转成Objective C文件,也就是XXX.h和XXX.m文件,转换的工具是使用protoc这种二进制文件来生成的

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

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

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

再执行 
- objectivec/DevTools/full_mac_build.sh

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

编译修改好的svmp.proto文件

在src目录(protoc所在目录)执行

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

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

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

protoc --proto_path=protocols --objc_out=gen protocols/svmp.proto

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

3、protobuf的集成

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

加入protobuf库

Podfile内 加入pod ‘Protobuf‘, ‘~> 3.2.0‘,pod install安装该库

就可以使用svmp.pbobjc.h来解析和创建数据了

以创建屏幕信息Screeninfo这个请求为例

Request * res = [[Request alloc]init];

res.type = Request_RequestType_Screeninfo;

NSData* data = [request data];

[self.socket send:data];

解析数据

Response * resp = [Response parseFromData:message error:nil];

    Response_ResponseType rt = resp.type;

以上是关于类似于xml的一种数据传输格式protobuf的主要内容,如果未能解决你的问题,请参考以下文章

Protobuf协议

干货 | protobuf-c之嵌入式平台使用

Flutter上线项目实战——即时通讯Protobuf

Flutter上线项目实战——即时通讯Protobuf

开源项目简报-Protobuf

咸鱼教程protobuf在websocket通讯中的使用