如果 JSON 也不满足你对数据传输体积的要求,还可以考虑一下 protobuf
来源:互联网 发布:换热器布管软件 编辑:程序博客网 时间:2024/05/21 19:43
如果 JSON 也不满足你对数据传输体积的要求,还可以考虑一下 protobuf
protobuf 是 Google 推出的一种数据传输格式,采用纯二进制数据传输,传输体积比 JSON 要小很多。
数据传输格式
如果你在开发一款 APP,就免不了要读取服务端的数据。 现在大家比较流行的做法是使用 JSON 作为数据传输格式。 JSON 的好处是数据结构清晰,并且可读性强。相比 XML 数据的体量要小很多。
正是这么多的优点,让 JSON 几乎成为了现在数据传输格式的标配。
接下来我们进入正题,说说我们这次要介绍的 protobuf。 既然 JSON 那么多优点,为什么还要出来个 protobuf 呢? 虽然 JSON 的数据体量已经比较小了,但它的整体文本结构还是纯文本形式的。也就是说在传输数据的时候,会一并把数据的组织格式也进行传输。比如:
{"name" : "swift","age" : 23}
上面是一个简单的 JSON 对象。 虽然这个数据的格式已经很简单了,但它依然把属性名称,比如 name 和 age, 以及大括号,引号这些用于表示数据格式的信息也进行传输了。
当然,如果你对 APP 的网络传输没那么高的要求,这也不成问题。 但如果有一天你想提升你 APP 的传输性能了,那么 protobuf 就是你可以采纳的解决方案之一了。
protobuf
protobuf 的全称是 Protocol Buffer。 protobuf 的主要特性就是二进制传输,并且它只传输”数据”,不会传输数据的”格式”。要使用 protobuf, 首先要定义数据的格式, 通过一个扩展名为 .proto 的文件来定义:
syntax = "proto3";message Person { string name = 1; int32 age = 2;}
这个 proto 文件看起来应该很熟悉。 第一行 syntax 定义了这个文件的语法格式。 因为 protobuf 有 2 和 3 两个主流版本,这里指定当前文件用的是哪个版本。
接下来就是消息格式的定义了,显而易见,我们定义了 Person 类型,有两个属性 name 和 age。 分别是 string 和 int32 类型。
协议格式定义好之后,用 protobuf 自带的命令可以将协议文件转换成 objective-c 的类文件:
$ protoc ./person.proto --objc_out ./
上面这个命令是把当前目录的 person.proto 文件,转换成 objc 类,然后输出到当前目录。成功运行命令后, 我们就会看到两个生成的代码文件了,把它们添加到 XCode 工程中即可。
然后我们就可以在代码中直接使用 Person 类来进行数据交互了:
Person *person = [[Person alloc] init];person.name = @"swift";person.age = 22;NSData *dataWillSend = [person data];
这里可以看到, Person 类的属性和我们之前在 person.proto 中定义的完全一样,它还提供了一个 data 方法,将数据直接序列化成 NSData, 这样我们在发送请求的时候,直接发送这个 NSData 就可以了。
如果是从服务端接收的请求返回, Person 类同样提供了解析数据的方法:
[Person parseFromData:dataWillReceived error:nil];
这样,我们的数据传输就真正做到了只发送数据本身,而不发送数据的格式了。因为数据的格式和解析规则都保留在客户端和服务端本地了。
总结
protobuf 给我们提供的就是这样一个更高效的数据传输协议。它自然有利有弊。 好处就是我们前面说的,让数据的传输效率最大化。相比 JSON 数据格式,它的数据传输体积更小。它只传输数据本身,不会传输格式信息。
但同样,它也有一些不便,比如 .proto 数据格式文件必须同时在客户端和服务端保存。 如果数据格式发生变化,两边同时调整的代价就会比较大。
总的来说,protobuf 给我们提供了一个新的选择,如果你的 APP 已经到了需要非常细致的优化性能的时候,那么 protobuf 也是一个不错的方案。 关于 protobuf 更详细完整的文档,大家可以参考它的 Github 主页: https://github.com/google/protobuf
如果你觉得这篇文章有帮助,还可以关注微信公众号 swift-cafe,会有更多我的原创内容分享给你~
来自:http://swiftcafe.io/2017/02/26/protobuffer/
同类热门经验
- iphone开发资源汇总
- iOS设计UI工具大全
- iOS 学习资料整理
- iOS及Mac开源项目和学习资料【超级全面】
- IOS之同步请求、异步请求、GET请求、POST请求
- iOS开发资源大全
阅读目录
- 数据传输格式
- protobuf
- 总结
- fiddler和charles抓包工具介绍和实际使用.ppt
- EXT中文手册7.pdf
- 隔壁老王的博客文集----Java、Web开发.pdf
- JSON 入门指南.docx
- JSON 基础教程.pdf
- [DevDiv翻译] iOS Cookbook 第八章 网络,JSON,XML 以及 Twitter.pdf
- 前端工程师必知必会-JSON.doc
- iOS6 CookBook 第9章_网络,json,xml以及twitter.pdf
- iOS 5 Programming Cookbook 第八章 网络,JSON,XML 以及 Twitter.pdf
- JSON 数据格式的使用方法入门教程.pdf
- JSON 数据格式解析.pdf
- JSON 数据格式解析.pdf
- JSON 核心技术应用(免费版).doc
- JSON c 语言开发指南.pdf
- Solr的使用说明文档.docx
- Android 移动终端与服务器数据传输的研究.pdf
- python爬虫.pptx
- 使用JSON进行数据传输.ppt
- Solr 学习笔记.pdf
- Solr 学习笔记.doc
- 开发一流的 Android SDK:Fabric SDK 的创建经验
- iOS开发者必备:自己总结的iOS、mac开源项目及库
- Java资源大全中文版
- iOS应用架构谈(三):网络层设计方案(上)
- iOS、mac开源项目及库汇总
- iOS及Mac开源项目和学习资料【超级全面】
- Google 开源序列化框架protobuf
- Android开源项目分类汇总
- 基于面向协议MVP模式下的软件设计-(iOS篇)
- iOS开发库整理
- iOS 第三方开源库的吐槽和备忘
- iOS应用性能调优的25个建议和技巧
- iOS应用性能调优的25个建议和技巧
- iOS应用性能调优的25个建议和技巧
- [转]百万级访问网站前期的技术准备
- 推荐一个轻量级跨平台c开发库:TBOX
- 什么是Node.js?
- 那些年,追过的开源软件和技术
- 为您的Web项目构建一个简单的JSON控制器
- RESTful架构详解
- 菜鸟必看:这些年我们爱犯的弱智错误
- 如果 JSON 也不满足你对数据传输体积的要求,还可以考虑一下 protobuf
- PagerSlidingTabStrip 分析 可以满足自定义的要求。
- easyUI构造满足tree要求的json
- android 自定义Button,满足你对Button呈现样式的一系列要求
- 强悍的vbs,很多时候如果只是简单的写一个windows桌面工具,可以优先考虑一下vbs,js什么的。
- 容器可以接受的类需满足的要求
- 留下一点点 如果还可以做你的朋友 梦想就让她继续
- NSNumberFormatter 应该可以满足你对数据形式的一般需求,值得了解一下
- 如果你还活着!
- 如果你养了一只可爱的机器宠物狗 你还会对它好吗?| 讨论
- 小话设计模式(零)设计模式可以满足你对编程的所有幻想(误)
- 如果你觉得自己对软件可以玩弄于手掌的,请进
- 如果还可以的话,我会加油的。
- SlidingMenu的使用详解(可以满足大部分的使用要求)
- 如果可以拥有你
- 如果可以恨你
- 《如果可以爱你》
- 如果你还记得我
- #ifndef PRINT_H …
- vector模板类
- 阿里云服务器配置HTTPS证书记录
- macport的使用
- c++中类对象不能访问类的私有成员…
- 如果 JSON 也不满足你对数据传输体积的要求,还可以考虑一下 protobuf
- c++多个源文件共用一个全局变量(e…
- getconf PAGE_SIZE
- Python函数的默认参数
- vs2010 vc++ 统一修改所…
- WIN7+Visual Studio 201…
- 利用JavaConfig配置Spring及SpringMvc的开发环境
- C++用new和不用new创建类对象区别(…
- 【C++ Primer】静态链接库(l…