当前位置: 首页 > article >正文

cJson——序列化格式json和protobuf对比

cJson——序列化格式json和protobuf对比

      • 1. 更小的消息体积
      • 2. 更快的序列化与反序列化速度
      • 3. 类型安全
      • 4. 向后和向前兼容性
      • 5. 更低的带宽消耗
      • 6. 高效的编码方式
      • 7. 易于跨语言支持
      • 8. 支持复杂的数据结构
      • 9. 更好的支持大型数据交换
      • 总结

Protocol Buffers (Protobuf)JSON 都是用于数据序列化的格式,但它们在性能、数据存储和应用场景方面有显著的不同。相对于 JSON,Protobuf 有以下几个重要优点:

1. 更小的消息体积

  • Protobuf 使用二进制格式进行数据表示,因此比 JSON 更紧凑。这意味着同样的数据,Protobuf 会占用更少的存储空间和带宽,特别是在数据量较大时。
  • JSON 是文本格式,每个字段和键值对都需要以字符串形式表示,这会导致相同数据的冗余存储,导致消息体积较大。

举例
假设你有一个结构体:

json

复制代码

{ "id": 123, "name": "Alice" }

JSON 格式会像上面这样存储,存储的是字符串(键和数据都为字符串)。而在 Protobuf 中,键名会被省略(由协议文件中的字段编号来标识),并且采用二进制格式来存储数据,这样能大大减少数据的大小。

优点

  • 更低的存储成本
  • 更低的网络带宽消耗

2. 更快的序列化与反序列化速度

  • Protobuf 采用二进制格式,序列化和反序列化速度通常比 JSON 更快。二进制格式的解析速度远超文本格式,尤其是在数据量较大的情况下,Protobuf 的性能优势更加明显。
  • JSON 需要将文本数据转为适合计算机操作的数据格式,这相对较慢,尤其在嵌套结构较复杂或数据量较大的情况下,性能差距更加明显。

优点

  • 更快的序列化/反序列化速度,适合高性能要求的应用

3. 类型安全

  • Protobuf 使用 严格的类型系统,每个字段的类型在 .proto 文件中都明确指定,这可以避免数据结构不匹配的问题。
  • JSON 则是一个动态类型系统,它只存储文本,并没有类型约束,所有的字段都可以是任意的 JSON 数据类型(如字符串、数字、数组、对象等),这可能导致类型错误或数据处理上的问题,特别是在数据格式复杂或传输的过程中出现不一致时。

优点

  • 强类型机制,减少由于类型不匹配引起的错误
  • 更好地支持自动化工具,如类型检查和代码生成

4. 向后和向前兼容性

  • Protobuf 设计时非常注重版本控制和兼容性,可以非常容易地处理向前和向后的兼容性。通过在 .proto 文件中为每个字段分配唯一的字段编号,即使某些字段在不同版本中发生变化,Protobuf 仍然可以正确处理数据。
  • JSON 缺少内建的版本控制机制,字段的添加或删除可能会导致兼容性问题,特别是在系统间交换数据时,旧版本和新版本的解析可能会出现问题。

优点

  • 通过字段编号保证良好的向前和向后兼容性,适合长期演进的系统

5. 更低的带宽消耗

  • 由于 Protobuf 的数据是以二进制格式传输的,通常比 JSON 小得多,这意味着 Protobuf 可以显著减少网络带宽的消耗,特别是在数据量较大或需要频繁通信的场景中。
  • JSON 需要以文本格式传输,导致其占用更多的带宽。

优点

  • 在带宽有限或对带宽消耗有严格要求的场景中,Protobuf 更具优势(例如 IoT、移动设备或低带宽网络环境)

6. 高效的编码方式

  • Protobuf 使用 紧凑的编码方式,字段的值被压缩并且不需要存储键名(只存储字段编号),这样可以减少数据的冗余存储。
  • JSON 则存储所有的字段名,并且每个字段的值都以字符串形式存储,这使得 JSON 比 Protobuf 占用更多的空间。

优点

  • 更高效的编码和存储方式,减少不必要的开销

7. 易于跨语言支持

  • Protobuf 提供了 多种语言支持,通过标准的 .proto 文件可以生成多种语言的代码,支持 C++、Java、Python、Go、C#、JavaScript 等多种语言。这使得 Protobuf 特别适合跨平台、跨语言的系统。
  • JSON 虽然几乎所有语言都有支持,但由于没有标准的结构定义文件,跨语言的使用可能会更加复杂,特别是在处理复杂的嵌套数据结构时,可能需要额外的手动工作。

优点

  • Protobuf 自动生成代码,简化跨语言数据交换

8. 支持复杂的数据结构

  • Protobuf 支持更复杂的数据结构,如嵌套消息、可选/必填字段、枚举、重复字段(数组),并且在生成的代码中会有类型验证,确保数据格式的正确性。
  • JSON 虽然也支持嵌套结构,但没有内建的类型验证和优化机制,可能在复杂数据结构中出现解析问题,且缺乏像 Protobuf 那样的强类型和规范。

优点

  • 更好地支持复杂数据模型,适合复杂系统的通信和数据存储

9. 更好的支持大型数据交换

  • Protobuf 由于其二进制格式的特点,可以在不增加带宽消耗的情况下处理更大的数据集。例如,在需要大量数据交换(如大文件传输、日志记录、数据库操作等)时,Protobuf 的性能优势非常明显。
  • JSON 在处理大型数据时,可能会因为其文本格式导致带宽占用过大,且解析和处理速度较慢。

优点

  • 更适合处理大量数据和高频次的数据交换,减少对系统性能的影响

总结

特性ProtobufJSON
消息大小更小(二进制格式)较大(文本格式)
序列化/反序列化速度更快较慢
数据类型强类型(需要 .proto 文件定义)弱类型(只存储文本)
兼容性良好的向前向后兼容性无内建的版本控制机制
带宽消耗更低更高
跨语言支持提供自动化代码生成,支持多种语言支持多种语言,但没有标准生成机制
复杂数据结构支持强大的数据类型和结构支持支持嵌套结构,但缺乏类型验证机制
适用场景高效、大数据、跨平台系统简单的配置文件、日志文件、Web API

总结:Protobuf 相对 JSON 的主要优点在于更小的消息体积、更快的序列化速度、类型安全、带宽消耗更低以及更好的跨语言支持等。对于需要高效数据交换、大规模数据处理以及高性能要求的系统,Protobuf 是一个更为理想的选择。而对于简单的配置文件、调试或人类可读的日志文件等场景,JSON 仍然是一个很好的选择,尤其是它的可读性和易于操作的特点。


http://www.kler.cn/a/488289.html

相关文章:

  • vue 导出excel接口请求和axios返回值blob类型处理
  • HarmonyOS中实现TabBar(相当于Android中的TabLayout+ViewPager)
  • 计算机网络之---MAC协议
  • 【vue3封装element-plus的反馈组件el-drawer、el-dialog】
  • 【C++】B2106 矩阵转置
  • 二十三种设计模式-原型模式
  • 单元测试MockitoExtension和SpringExtension
  • poi处理多选框进行勾选操作下载word以及多word文件压缩
  • Cognitive architecture 又是个什么东东?
  • 【Rust自学】11.7. 按测试的名称运行测试
  • 记录一个移动端表格布局,就是一行标题,下面一列是对应的数据,一条一条的数据,还有点击数据进入详情的图标,还可以给一列加input输入框,还可以一对多
  • dubbo3 负载均衡
  • js迭代器模式
  • python+camelot库:提取pdf中的表格数据
  • 工厂人员定位管理系统方案(二)人员精确定位系统架构设计,适用于工厂智能管理
  • 《零基础Go语言算法实战》【题目 2-1】使用一个函数比较两个整数
  • iOS - 数组的真实类型
  • .NET 终止或结束进程
  • [SAP ABAP] 使用LOOP AT...ASSIGNING FIELD-SYMBOL 直接更新内表数据
  • Unity3D使用GaussianSplatting加载高斯泼溅模型
  • React Error Boundary 错误边界限制
  • Java Web开发进阶——Spring Security基础与应用
  • 华为C语言编程规范总结
  • 用户界面的UML建模11
  • MIT 6.S081 Lab9 File System
  • jeecg-boot 表单选择一条数据保存