快速上手 iOS Protocol Buffer | 来自缤纷多彩的灰
本文主要介绍在 iOS 开发中如何快速上手使用 Protobuf 。更多关于 Protobuf 的介绍和相关的功能 api,读者可自行查阅官网。
Protocol Buffer(简称 Protobuf)是一种由Google开发的语言中立、平台无关的序列化数据结构的方法。它允许你定义结构化的数据,并提供一种高效且灵活的方式进行数据序列化和反序列化。
安装 Protobuf 工具
最简单的方式是直接通过 brew 进行安装:
brew install protobuf // 支持生成.h和.m文件,和其他多种语言的文件
brew install swift-protobuf // 支持生成.swift文件
检查是否安装成功:
protoc --version
protoc-gen-swift --version
创建 .proto 文件
// 使用V3语法
syntax = "proto3"
// OC语言可选,添加模型文件前缀
option objc_class_prefix = "MY"
// message代表一个模型
message Test {
string title = 1;
int32 tag = 2;
Request request = 3; // 自定义的 Request 类型
repeated string values = 4; // 数组
}
message Request {
string url = 1;
}
OC、Swift 代码生成
Protobuf 提供api用于根据.proto文件生成代码,需传入两个参数,生成结果与参数的传入顺序无关:
- .proto 文件的路径(下文中用 source_path 表示)
- 需要生成的目标语言 (下文用 target_language 表示)以及文件的输出路径(下文用 target_path 表示)
protoc source_path/xxx.proto --target_language_out=target_path
protoc --objc_out=. xxx.proto // 在当前文件夹根据xxx.proto生成.h和.m文件
protoc xxx.proto --swift_out=. // 在当前文件夹根据xxx.proto生成.swift文件
在 iOS 工程中的使用
1.工程添加依赖
pod 'Protobuf' // OC和其他多种语言的能力依赖
pod 'SwiftProtobuf' // swift能力依赖
2.把转换后的代码文件加入到工程。
3.跟正常使用某个类的方法一样。
/*
{
"title": "test",
"tag": 1,
"request": {
"url": "www.fivehow.com"
},
"values": ["value1", "value2"]
}
*/
let request = Request.with { $0.url = "www.whlcj.github.io" }
// ProtoBuf data
let test = Test.with {
$0.title = "test"
$0.tag = 1
$0.request = request
$0.values = ["value1", "value2"]
}
let binaryData = try? test.serializedData()
guard let binaryData = binaryData else { return }
_ = try? Test(serializedData: binaryData)
// Json Data
let jsonStr = "{\"title\":\"test\", \"tag\":1, \"request\":{\"url\":\"www.whlcj.github.io\"},\"values\":[\"value1\", \"value2\"]}"
let jsonStrData = jsonStr.data(using: .utf8)
// 对比 data length
print("binaryData: \(binaryData.count)") // 43
guard let jsonStrData = jsonStrData else { return }
print("jsonStrData: \(jsonStrData.count)") // 92
protobuf 基础类型与Swift类型映射关系
Proto type | Swift Type |
---|---|
int32 | Int32 |
sint32 | Int32 |
sfixed32 | Int32 |
uint32 | UInt32 |
fixed32 | UInt32 |
int64 | Int64 |
sint64 | Int64 |
sfixed64 | Int64 |
uint64 | UInt64 |
fixed64 | UInt64 |
bool | Bool |
float | Float |
double | Double |
string | String |
bytes | Data |