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 也要被淘汰了吗的更多相关文章

  1. 常见Serialize技术探秘(ObjectXXStream、XML、JSON、JDBC byte编码、Protobuf)

    目前业界有各种各样的网络输出传输时的序列化和反序列化方案,它们在技术上的实现的初衷和背景有较大的区别,因此在设计的架构也会有很大的区别,最终在落地后的:解析速度.对系统的影响.传输数据的大小.可维护性 ...

  2. WebApi接口 - 响应输出xml和json

    格式化数据这东西,主要看需要的运用场景,今天和大家分享的是webapi格式化数据,这里面的例子主要是输出json和xml的格式数据,测试用例很接近实际常用情况:希望大家喜欢,也希望各位多多扫码支持和点 ...

  3. 【.net 深呼吸】聊聊WCF服务返回XML或JSON格式数据

    有时候,为了让数据可以“跨国经营”,尤其是HTTP Web有关的东东,会将数据内容以 XML 或 JSON 的格式返回,这样一来,不管客户端平台是四大文明古国,还是处于蒙昧时代的原始部落,都可以使用这 ...

  4. C# XML转JSON,不引用第三方JSON.NET类库

    应用场景:需要调用第三方接口(返回XML)数据,然后供自己多个系统使用(涉及跨域,使用JSONP) 代理:调用接口(把XML转换为JSONP解决跨域问题) B/S应用系统:调用代理返回的数据进行UI显 ...

  5. xml和json的区别

    本文转自SanMaoSpace的博客 链接地址如下:http://www.cnblogs.com/SanMaoSpace/p/3139186.html 1.定义介绍 (1).XML定义扩展标记语言 ( ...

  6. 数据解析(XML和JSON数据结构)

    一   解析 二 XML数据结构 三 JSON 数据结构     一 解析 1  定义: 从事先规定好的格式中提取数据     解析的前提:提前约定好格式,数据提供方按照格式提供数据.数据获取方则按照 ...

  7. xStream完美转换XML、JSON

    xStream框架 xStream可以轻易的将Java对象和xml文档相互转换,而且可以修改某个特定的属性和节点名称,而且也支持json的转换: 前面有介绍过json-lib这个框架,在线博文:htt ...

  8. 【原】iOS学习之XML与JSON两种数据结构比较和各自底层实现

    1.XML与JSON两种数据结构的优缺点 1> XML 优点:
 格式统一, 符合标准
 容易与其他系统进行远程交互, 数据共享比较方便 
 缺点: XML文件格式文件庞大, 格式复杂, 传输占 ...

  9. C#.NET序列化XML、JSON、二进制微软自带DLL与newtonsoft(json.net)

    序列化是将对象转换成另一种格式(XML.json.二进制byte[]) JSON序列化 .NET中有三种常用的JSON序列化的类,分别是: Newtonsoft.Json.JsonConvert类(推 ...

随机推荐

  1. [asp.net]C#实现json的序列化和反序列化

    在做asp.net和unity进行http通信的时候,当unity客户端发出表单请求的时候,我要将他要请求的数据以json的格式返回给客户端,让客户端来解析.服务器端这一块就涉及到json的序列化和反 ...

  2. Swift编程语言学习1.7——断言

    断言 可选能够让你推断值是否存在,你能够在代码中优雅地处理值缺失的情况.然而,在某些情况下,假设值缺失或者值并不满足特定的条件,你的代码可能并不须要继续执行.这时.你能够在你的代码中触发一个断言(as ...

  3. svn“Previous operation has not finished; run 'cleanup' if it was interrupted“报错的解决方法

    今天碰到了个郁闷的问题,svn执行clean up命令时报错“Previous operation has not finished; run 'cleanup' if it was interrup ...

  4. TCP Socket Programming in Node.js

    TCP Socket Programming in Node.js Posted on October 26th, 2011 under Node.jsTags: Client, node.js, S ...

  5. 未能加载文件或程序集“Microsoft.SqlServer.Sqm, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91”或它的某一个依赖项。系统找不到指定的文件。 (SqlMgmt)

    解决方法: Copy this file "Microsoft.SqlServer.Sqm.dll" in the forder "C:/Program Files/Mi ...

  6. 【Nodejs】外研社一年级起各年级英语音频下载(缺456年级上)

    在 https://news.21cnjy.com/A/130/235/V729768.shtml 有各年级英语音频下载,用爬虫把能下的都下了,除了四五六年级上册的. 爬虫 http://www.cn ...

  7. 配置 Windows 下的 nodejs C++ 模块编译环境 安装 node-gyp

    配置 Windows 下的 nodejs C++ 模块编译环境 根据 node-gyp 指示的 Windows 编译环境说明, 简单一句话就是 "Python + VC++ 编译环境&quo ...

  8. IOCCC(The International Obfuscated C Code Contest)

    国际 C 语言混乱代码大赛(IOCCC, The International Obfuscated C Code Contest)是一项国际编程赛事,从 1984 年开始,每年举办一次(1997年.1 ...

  9. 创建Maven Module时报错:The parent project must have a packaging type of POM

    创建Maven Module时报错:The parent project must have a packaging type of POM 解决的办法,是把父项目的Packaging改成pom:

  10. iOS 动画效果。简单的提示消失

    UILabel * label1 = [[UILabel alloc]initWithFrame:CGRectMake(, , , )]; label1.text = @"qingjoin& ...