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类(推 ...
随机推荐
- NSURLSession下载
ios7引入了NSURLSession,通过它可以支持后台相关的网络操作的新特性: 1. 后台上传下载: 2.不需要通过nsoperation,直接用nsurlsession的api就可以做到网络操作 ...
- DICOM-RT:放疗领域中的各种影像
背景: DICOM-RT系列博文着眼于DICOM3.0中对放疗领域的补充标准,即DICOM-RT.为了方便兴许对DICOM-RT中相关IOD.SOP概念的理解,专栏最近做了放疗相关知识点的普及. PS ...
- Laravel Composer 脚本
composer update --no-scripts 执行静态文件 composer dump-autoload 文件映射
- 转:Raft一致性选举算法的ppt与视频
http://xiaorui.cc/2016/07/08/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB-%E3%80%8A%E5%88%86%E5%B8%83%E5%BC% ...
- VS2013第一个应用boost的程序
下载boost binary https://sourceforge.net/projects/boost/files/boost-binaries/1.67.0_b1/ 由于我用的是Windows1 ...
- IE DIV背景透明,点击事件不响应解决方案
IE DIV背景透明,给DIV绑定点击事件, 当点击DIV时,不会响应已经绑定的点击事件. 解决方案是给DIV的设置以下样式. background-image: url(data:image/gif ...
- C/C++中的值传递,引用传递,指针传递,指针引用传递
在面试过程中,被面试官问到传值和传引用的区别,之前没有关注过这个问题,今天在网上找了一篇包含代码和图片的讲解文章,浅显易懂,遂转载备忘. 1. 值传递 void f( int p){ printf(& ...
- hibernate update 只更新部分字段的3种方法(其实我只想说第二种)
hibernate 中如果直接使用Session.update(Object o);会把这个表中的所有字段更新一遍. 比如: public class Teacher Test { @Test pub ...
- 通过adb命令在Android设备中执行Java命令, 并调用so文件。
一.难点一:无法复制so文件到/system/lib或者/vendor/lib下,提示只读 解决方法: 2.使用android device monitor放库进入到 /system/lib出现只读权 ...
- Java之所有对象的公用方法>10.Always override toString
providing a good toString implementation makes your class much more pleasant to use. It is recommend ...