Swift Protobuf 初探 —— 继 XML 后,JSON 也要被淘汰了吗
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”,那么接下来我们就将通过 Swift 官方实现的 Protobuf 来一探究竟。
Swift Protobuf
从去掉软盘到干掉光驱,从摈弃 Flash 推广 HTML5 ,到现在干脆把标准音频接口抹去,苹果一向善于引领科技时尚,那么在面向未来的数据交换格式上自然不会落后,因此 Swift Protobuf 应运而生。
开始动手尝试吧
本来我想拿照官方示例来走一遍的,但这次正好有个绝佳的示例,既有客户端又有服务端,可以“做”享其成一次,其中还涉及到 Go 语言,趁此机会也可以把玩一番。
将 ProtoBufExample (https://github.com/KyoheiG3/ProtobufExample)克隆至本地,
➜ git clone https://github.com/KyoheiG3/ProtobufExample.git
➜ cd ProtobufExample
配置客户端
➜ cd ./ProtobufClient
➜ pod install
初始化服务端
➜ cd ./ProtobufServer
➜ swift build
// 创建工程文件,以便在 Xcode 下编辑
➜ swift package generate-xcodeproj
启动 API
➜ ./.build/debug/api
配置并启动服务 with Go
➜ go get github.com/golang/protobuf/protoc-gen-go
➜ go run server/api.go
-
有必要的话,先下载安装 Go 语言环境,并配置 $GOPATH
➜ mkdir ~/go
➜ export GOPATH=~/go
➜ export PATH=$PATH:$GOPATH/bin
体会 .proto
安装
protobuf
➜ 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.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 的友好兼容,感兴趣的朋友可以自己动手玩一下。
探索更多
Google Protocol Buffers
https://developers.google.com/protocol-buffers/
Swift Protobuf
https://github.com/apple/swift-protobuf
ProtobufExample – Github
https://github.com/KyoheiG3/ProtobufExample
深入理解 ProtoBuf
Google Protocol Buffer 的使用和原理 – IBM
https://www.ibm.com/developerworks/cn/linux/l-cn-gpb/
相关文章
- XML和JSON数据格式
- XML和JSON数据格式
- 通过notepad++将混乱的xml配置的格式进行美化
- xml Data Type Methods in sql server
- 能源项目xml文件标签释义--CommonsMultipartResolver
- 为什么LINQ to XML的性能要优于XmlDocument?
- 解析xml文件的几种技术
- JavaDemo——jackson读写json和xml
- 将XML格式文件转换JSON文件格式
- JSONUtil(JAVA对象/List与json互转,xml与json互转)
- JSON和XML的比较
- XML、XML约束、XML解析、常用的xml解析器(DOM4J)、XPATH
- C#JSON与XML相互转换
- 【Json】在线JSON转MySQL建表语句工具
- PHP 开发 APP 接口 学习笔记与总结 - JSON 结合 XML 方式封装通信接口
- Open XML Format SDK引用
- 为什么都反对XML而支持使用json呢?
- PHP接收和发送XML数据(json也通用)
- XML,Json,Protobuf 序列化协议
- idea 找不到classpath 为resource下的xml
- xStream完美转换XML、JSON
- JSON与XML的区别比较(转)
- Java Jaxb JavaBean与XML互转
- Unity 工具类 之 Excel 转换为 json、csv、xml、lua格式
- web.xml<context-param>与<init-param>的作用与区别