<关闭侧栏

| 当前位置: | 主页 > 好友心水论坛 >

如果 JSON 也不满足你对数据传输体积的要求还可以考虑一下 proto

来源:未知 作者:admin 时间:2019-09-15 10:20 文字大小: 【大】 【中】 【小】 点击:
核心提示:protobuf 是 Google 推出的一种数据传输格式,采用纯二进制数据传输,传输体积比 JSON 要小很多。 如果你在开发一款 APP,就免不了要读取服务端的数据。 现在大家比较流行的做法是使用 JSON 作为数据传输格式。 JSON 的好处是数据结构清晰,并且可读性强。相

  protobuf 是 Google 推出的一种数据传输格式,采用纯二进制数据传输,传输体积比 JSON 要小很多。

  如果你在开发一款 APP,就免不了要读取服务端的数据。 现在大家比较流行的做法是使用 JSON 作为数据传输格式。 JSON 的好处是数据结构清晰,并且可读性强。相比 XML 数据的体量要小很多。

  接下来我们进入正题,说说我们这次要介绍的 protobuf。 既然 JSON 那么多优点,为什么还要出来个 protobuf 呢? 虽然 JSON 的数据体量已经比较小了,但它的整体文本结构还是纯文本形式的。也就是说在传输数据的时候,会一并把数据的组织格式也进行传输。比如:

  上面是一个简单的 JSON 对象。 虽然这个数据的格式已经很简单了,但它依然把属性名称,比如 name 和 age, 以及大括号,引号这些用于表示数据格式的信息也进行传输了。

  当然,如果你对 APP 的网络传输没那么高的要求,这也不成问题。 但如果有一天你想提升你 APP 的传输性能了,那么 protobuf 就是你可以采纳的解决方案之一了。

  protobuf 的全称是 Protocol Buffer。 protobuf 的主要特性就是二进制传输,并且它只传输”数据”,不会传输数据的”格式”。要使用 protobuf, 首先要定义数据的格式, 通过一个扩展名为 .proto 的文件来定义:

  这个 proto 文件看起来应该很熟悉。 第一行 syntax 定义了这个文件的语法格式。 因为 protobuf 有 2 和 3 两个主流版本,这里指定当前文件用的是哪个版本。

  接下来就是消息格式的定义了,显而易见,我们定义了 Person 类型,有两个属性 name 和 age。 分别是 string 和 int32 类型。

  协议格式定义好之后,用 protobuf 自带的命令可以将协议文件转换成 objective-c 的类文件:

  上面这个命令是把当前目录的 person.proto 文件,转换成 objc 类,然后输出到当前目录。成功运行命令后, 我们就会看到两个生成的代码文件了,把它们添加到 XCode 工程中即可。

  这里可以看到, Person 类的属性和我们之前在 person.proto 中定义的完全一样,它还提供了一个 data 方法,将数据直接序列化成 NSData, 这样我们在发送请求的时候,直接发送这个 NSData 就可以了。

  如果是从服务端接收的请求返回, Person 类同样提供了解析数据的方法:

  这样,我们的数据传输就真正做到了只发送数据本身,而不发送数据的格式了。因为数据的格式和解析规则都保留在客户端和服务端本地了。

  protobuf 给我们提供的就是这样一个更高效的数据传输协议。它自然有利有弊。 好处就是我们前面说的,让数据的传输效率最大化。相比 JSON 数据格式,它的数据传输体积更小。它只传输数据本身,不会传输格式信息。

  但同样,它也有一些不便,比如 .proto 数据格式文件必须同时在客户端和服务端保存。 如果数据格式发生变化,两边同时调整的代价就会比较大。

  总的来说,protobuf 给我们提供了一个新的选择,如果你的 APP 已经到了需要非常细致的优化性能的时候,那么 protobuf 也是一个不错的方案。 关于 protobuf 更详细完整的文档,大家可以参考它的 Github 主页:

  用户喜欢...iOS开源-轻量级 JSON 转 Model 框架,使用链式编程,无侵入

  Json/xml自动生成model类插件(上传者:netyouli) 自动把json或者xml字符串自动生成模型类文件内容;避免手工创建模型类的麻烦和错误率(提高开发效率);自动生成类名称首字符大写 ;生成的...

  德州仪器(TI)TPS7B82-Q1低压降(LDO)线V负载突降保护)的宽输入电压范围。低至3V的操作允许T...

  SGM8139可以在1.4V到5.5V的电压范围内工作,超低工作电流的性质让它非常适合单节或者双节干电池供电的应用,有效降低系统成...

  ADI公司的LT7101同步降压型稳压器是一款高效率,单片式同步降压型DC / DC转换器,采用恒定频率,平均电流模式控制架构。它...

  ADI公司的LT3093负线性稳压器是一款高性能低压差负线性稳压器,采用ADI公司的超低噪声和超高PSRR架构,可为噪声敏感应用提...

  ADI公司的HMC881A单片微波集成电路(MMIC)低通滤波器具有用户可选择的截止频率。通过在0V和14V之间施加单个模拟调谐电压,...

  ADI公司ADcmXL3021三轴振动传感器是一款宽带宽,低噪声,高度集成的振动监测模块,将先进的MEMS传感器,优化的信号链和嵌入...

  赛灵思ZYNQ-7000所有可编程片上系统允许灵活的平台,推出新的解决方案,同时提供传统ASIC和SoC用户一个完全可编程的替代方...

  AKM 的 AK09940 是磁颗粒检测和金属污染检测的理想选择 AKM 的 AK09940 是一款通用数字输出三轴磁传感器 IC,采用 TMR 技术,具有...

  德州仪器(TI)的超小型双通道开关非常适用于DC / AC逆变器和DC / DC转换器等应用 德州仪器(TI)的 TMP390A超低功耗双通道电阻...www.cc33666.com要以习近平新时