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": ,
"title": ,
"author": ,
]}
public var protoFieldNames: [String: Int] {return [
"id": ,
"title": ,
"author": ,
]} public var id: Int64 = public var title: String = "" public var author: String = "" public init() {}
......
......
......
if !keys.isEmpty {
try visitor.visitMapField(fieldType: ProtobufMap.self, value: keys, protoFieldNumber: , 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/
Swift Protobuf 初探 —— 继 XML 后,JSON 也要被淘汰了吗的更多相关文章
- 常见Serialize技术探秘(ObjectXXStream、XML、JSON、JDBC byte编码、Protobuf)
目前业界有各种各样的网络输出传输时的序列化和反序列化方案,它们在技术上的实现的初衷和背景有较大的区别,因此在设计的架构也会有很大的区别,最终在落地后的:解析速度.对系统的影响.传输数据的大小.可维护性 ...
- WebApi接口 - 响应输出xml和json
格式化数据这东西,主要看需要的运用场景,今天和大家分享的是webapi格式化数据,这里面的例子主要是输出json和xml的格式数据,测试用例很接近实际常用情况:希望大家喜欢,也希望各位多多扫码支持和点 ...
- 【.net 深呼吸】聊聊WCF服务返回XML或JSON格式数据
有时候,为了让数据可以“跨国经营”,尤其是HTTP Web有关的东东,会将数据内容以 XML 或 JSON 的格式返回,这样一来,不管客户端平台是四大文明古国,还是处于蒙昧时代的原始部落,都可以使用这 ...
- C# XML转JSON,不引用第三方JSON.NET类库
应用场景:需要调用第三方接口(返回XML)数据,然后供自己多个系统使用(涉及跨域,使用JSONP) 代理:调用接口(把XML转换为JSONP解决跨域问题) B/S应用系统:调用代理返回的数据进行UI显 ...
- xml和json的区别
本文转自SanMaoSpace的博客 链接地址如下:http://www.cnblogs.com/SanMaoSpace/p/3139186.html 1.定义介绍 (1).XML定义扩展标记语言 ( ...
- 数据解析(XML和JSON数据结构)
一 解析 二 XML数据结构 三 JSON 数据结构 一 解析 1 定义: 从事先规定好的格式中提取数据 解析的前提:提前约定好格式,数据提供方按照格式提供数据.数据获取方则按照 ...
- xStream完美转换XML、JSON
xStream框架 xStream可以轻易的将Java对象和xml文档相互转换,而且可以修改某个特定的属性和节点名称,而且也支持json的转换: 前面有介绍过json-lib这个框架,在线博文:htt ...
- 【原】iOS学习之XML与JSON两种数据结构比较和各自底层实现
1.XML与JSON两种数据结构的优缺点 1> XML 优点: 格式统一, 符合标准 容易与其他系统进行远程交互, 数据共享比较方便 缺点: XML文件格式文件庞大, 格式复杂, 传输占 ...
- C#.NET序列化XML、JSON、二进制微软自带DLL与newtonsoft(json.net)
序列化是将对象转换成另一种格式(XML.json.二进制byte[]) JSON序列化 .NET中有三种常用的JSON序列化的类,分别是: Newtonsoft.Json.JsonConvert类(推 ...
随机推荐
- PHP入门(一)
一.概述 PHP(Hypertext Preprocessor缩写),全称超级文本预处理器,是一种在服务器端执行的脚本语言.因此既具备了脚本语言的优缺点 ,又具备了后台服务器语言的优异性能.可以说PH ...
- HDU 1234 (浙大计算机研究生复试上机考试-2005年) 开门人和关门人 (水)
开门人和关门人 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...
- Android -- View流程
在自定义view中打log,view的显示共有三种,visible.invisible和gone,分别看一下log: gone onVisibilityChanged construct 2 para ...
- 个基于TensorFlow的简单故事生成案例:带你了解LSTM
https://medium.com/towards-data-science/lstm-by-example-using-tensorflow-feb0c1968537 在深度学习中,循环神经网络( ...
- __attribute__中constructor和destructor[总结]
1.前言 最近看到一份代码,看到一个函数前面用__attribute__((destructor))修饰,当时感觉有点怪怪的,搜了整个程序,也没发现哪个地方调用这个函数.于是从字面意思猜想,该函数会在 ...
- MySQL连接数过多登录不上
[mysqld_safe]socket = /var/run/mysqld/mysqld.socknice = 0 [mysqld]## * Basic Set ...
- virtualBox导入虚拟机启动报错
今天使用Oracle VMbox在导入虚拟机后,启动时报了如下错误: A new node couldn't be inserted because one with the same name ex ...
- ASP入门(二)-创建Access数据库
通常来说,ASP程序是搭配Access数据库来使用的,因此在安装完ASP环境后,为了方便建立和管理数据库,我们还需要安装Access数据库. Access是Microsoft Office家族中的一员 ...
- mac 安装 RabbitMQ
https://blog.csdn.net/u010046908/article/details/54773323
- C++中public、protected、private的差别
第一: private,public,protected的訪问范围: private: 仅仅能由该类中的函数.其友元函数訪问,不能被不论什么其它訪问.该类的对象也不能訪问. protected: ...