Protocol buffers are Google's language-neutral, platform-neutral, extensible mechanism for serializing structured data – think XML, but smaller, faster, and simpler. —— Google Official Definitionjavascript
简单地说,Protocol Buffers 就是一种轻量高效的结构化数据交换格式,语言无关、平台无关、可扩展。理解地直白粗暴一点就是“更厉害更面向将来的 JSON”,那么接下来咱们就将经过 Swift 官方实现的 Protobuf
来一探究竟。java
从去掉软盘到干掉光驱,从摈弃 Flash
推广 HTML5
,到如今干脆把标准音频接口抹去,苹果一贯善于引领科技时尚,那么在面向将来的数据交换格式上天然不会落后,所以 Swift Protobuf
应运而生。linux
原本我想拿照官方示例来走一遍的,但此次正好有个绝佳的示例,既有客户端又有服务端,能够“作”享其成一次,其中还涉及到 Go
语言,趁此机会也能够把玩一番。git
将 ProtoBufExample 克隆至本地github
➜ git clone https://github.com/KyoheiG3/ProtobufExample.git
➜ cd ProtobufExample复制代码
配置客户端golang
➜ cd ./ProtobufClient
➜ pod install复制代码
初始化服务端shell
➜ cd ./ProtobufServer
➜ swift build
// 建立工程文件,以便在 Xcode 下编辑
➜ swift package generate-xcodeproj复制代码
启动 APIjson
➜ ./.build/debug/api复制代码
配置并启动服务 with Goswift
➜ go get github.com/golang/protobuf/protoc-gen-go
➜ go run server/api.go复制代码
➜ mkdir ~/go
➜ export GOPATH=~/go
➜ export PATH=$PATH:$GOPATH/bin复制代码
.proto
安装
protobuf
api
➜ brew install protobuf复制代码
用 Swift 编译
protobuf
➜ cd ./ProtobufServer
➜ swift build
➜ protoc --plugin=protoc-gen-swift=.build/debug/protoc-gen-swift --swift_out=../protos --proto_path=../protos ../protos/DataModel.proto复制代码
此时咱们就能在 protos
这个输出目录下就能够看到刚刚生成的对应 .pb.swift
文件了。
/* * Generated by the protocol buffer compiler. * Source: DataModel.proto */
import Foundation
import SwiftProtobuf
public struct BookInfo: ProtobufGeneratedMessage {
public var swiftClassName: String {return "BookInfo"}
public var protoMessageName: String {return "BookInfo"}
public var protoPackageName: String {return ""}
public var jsonFieldNames: [String: Int] {return [
"id": 1,
"title": 3,
"author": 2,
]}
public var protoFieldNames: [String: Int] {return [
"id": 1,
"title": 3,
"author": 2,
]}
public var id: Int64 = 0
public var title: String = ""
public var author: String = ""
public init() {}
......
......
......
if !keys.isEmpty {
try visitor.visitMapField(fieldType: ProtobufMap<ProtobufString,ProtobufString>.self, value: keys, protoFieldNumber: 4, protoFieldName: "keys", jsonFieldName: "keys", swiftFieldName: "keys")
}
}
public func _protoc_generated_isEqualTo(other: MyLibrary) -> Bool {
if id != other.id {return false}
if name != other.name {return false}
if books != other.books {return false}
if keys != other.keys {return false}
return true
}
}复制代码
其中还包括了一些对 JSON
的友好兼容,感兴趣的朋友能够本身动手玩一下。
ProtoBuf