j9九游会登陆--首页直达

Swift Protobuf 初探 —— 继 XML 后,JSON 也要被镌汰
  • 智网科技
  • ###
  • 分类: 履历之谈
  • 阅读量: 198

250f7ef7723ddc0cb3fe.jpg

Protocol Buffers 是什么?

Protocol buffers are Google's language-neutral, platform-neutral, extensible mechanism for serializing structured data – think XML, but smaller, faster, and simpler. —— Google Official Definition

复杂地说,Protocol Buffers 便是一种轻量高效的布局化数据互换款式,言语有关、平台有关、可扩展。了解地直白粗犷一点便是“更凶猛更面向将来的 JSON”,那么接上去j9九游会就将经过 Swift 官方完成的 Protobuf 来一探求竟。

Swift Protobuf

从去失软盘到干失光驱,从屏弃 Flash 推行 HTML5 ,到如今爽性把尺度音频接口抹去,苹果一直擅长引领科技时髦,那么在面向将来的数据互换款式上天然不会落伍,因而 Swift Protobuf 应运而生。

开端入手实验吧

原本我想拿照官方示例来走一遍的,但这次恰好有个绝佳的示例,既有客户端又有办事端,可以“做”享其成一次,此中还触及到 Go 言语,趁此时机也可以把玩一番。

将 ProtoBufExample 克隆至当地

1
2
? git clone https://github.com/KyoheiG3/ProtobufExample.git
? cd ProtobufExample

设置装备摆设客户端

1
2
? cd ./ProtobufClient
? pod install

初始化办事端

1
2
3
4
? cd ./ProtobufServer
? swift build
// 创立工程文件,以便在 Xcode 下编辑
? swift package generate-xcodeproj

启动 API

1
? ./.build/debug/api

设置装备摆设并启动办事 with Go

1
2
? go get github.com/golang/protobuf/protoc-gen-go
? go run server/api.go

有须要的话,先下载安置 Go 言语情况,并设置装备摆设 $GOPATH

 

1
2
3
? mkdir ~/go
? export GOPATH=~/go
? export PATH=$PATH:$GOPATH/bin

领会 .proto

安置 protobuf

1
? brew install protobuf

用 Swift 编译 protobuf

1
2
3
? cd ./ProtobufServer
? swift build
? protoc --plugin=protoc-gen-swift=.build/debug/protoc-gen-swift --swift_out=../protos --proto_path=../protos ../protos/DataModel.proto

此时j9九游会就能在 protos 这个输入目次下就可以看到方才天生的对应 .pb.swift 文件了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/*
 * 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
  }
}</protobufstring,protobufstring>

此中还包罗了一些对 JSON 的友爱兼容,感兴味的冤家可以本人入手玩一下。

探究更多

深化了解 ProtoBuf