json和pb的比较

1.介绍

在数据序列化和通信领域,schema 指的是用于定义数据结构的模式结构描述 。它描述了数据的字段、类型、嵌套结构和约束,并在数据验证和解释上发挥重要作用。常见的 schema 格式包括 Protocol Buffers (proto)、JSON Schema、XML Schema 等。

Protocol Buffers(简称 proto)和 JSON 都是用于数据交换的格式,但在 schema 的强度和类型系统上有一些关键差异,使得 proto 在某些方面比 JSON 更具优势。

1.1 pb类型检查更严格

  • Proto :proto 的 schema 定义了每个字段的确切类型(例如 int32floatstringboolenum、嵌套消息等),这使得数据更加清晰、可预测。proto 编译器会根据 schema 自动生成代码,确保序列化和反序列化的数据符合预定的类型和结构。
  • JSON:虽然 JSON Schema 可以定义字段的类型,但在实际使用中 JSON 并不强制类型检查。JSON 本身是一种松散的格式,通常在序列化或解析时不进行强类型约束,这容易导致数据格式和类型不一致的问题。

例子,数组 values 包含了整数、字符串、布尔值和对象等不同类型。JSON 不会强制验证数组元素的类型一致性,但在解析或操作 values 数组时,类型不一致可能会带来逻辑问题。

javascript 复制代码
{
    "values": [1, "2", true, {"nested": "object"}]
}

JSON 不进行类型检查,数据格式问题通常只能在应用程序层面捕获,并没有自动的类型校验机制。

1.2 数据大小和性能

  • Proto :proto 使用二进制格式进行序列化,更加紧凑和高效。在网络传输和存储方面,比 JSON 的文本格式更节省空间。proto 在读取、写入和传输数据时性能更高,尤其在处理大量数据时,proto 的 schema 能帮助优化数据处理流程。
  • JSON:JSON 是一种文本格式,通常比 proto 的二进制格式大,占用更多的带宽和存储空间。此外,由于 JSON 需要解析复杂的文本格式,相对耗时,尤其在数据量较大时性能较差。

1.3 前向兼容和后向兼容

  • Proto:proto schema 支持前向和后向兼容,允许定义字段时指定字段编号,以便在 schema 变化时保留旧字段并添加新字段。这样在不同版本间升级时,旧服务和新服务能继续通信而不会出错。
  • JSON:JSON 缺乏直接的前向和后向兼容支持。若添加、删除或更改字段,需要客户端和服务端都进行更新和兼容处理,不然可能导致数据解释失败。

后向兼容:

后向兼容(backward compatibility)意味着旧版本的客户端服务端 能够解析新版本数据 的主要字段。通常指的是在 schema 中新增字段 ,而不影响旧版本的解析。Proto 解析器会忽略未知字段,但依然可以成功读取和解析已知的字段。

前向兼容:

前向兼容(forward compatibility)指的是新版本的客户端服务端 能够解析旧版本数据 中的已知字段,而不会因缺少字段导致错误。这种兼容性通常是在删除或弃用字段时体现。被移除的字段在解析时为空。

相关推荐
仍然.2 分钟前
MYSQL--- 聚合查询,分组查询和联合查询
数据库
一 乐6 分钟前
校园二手交易|基于springboot + vue校园二手交易系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
啦啦啦_99999 分钟前
Redis-0-业务逻辑
数据库·redis·缓存
自不量力的A同学41 分钟前
Redisson 4.2.0 发布,官方推荐的 Redis 客户端
数据库·redis·缓存
Exquisite.43 分钟前
Mysql
数据库·mysql
全栈前端老曹1 小时前
【MongoDB】深入研究副本集与高可用性——Replica Set 架构、故障转移、读写分离
前端·javascript·数据库·mongodb·架构·nosql·副本集
R1nG8631 小时前
CANN资源泄漏检测工具源码深度解读 实战设备内存泄漏排查
数据库·算法·cann
阿钱真强道1 小时前
12 JetLinks MQTT直连设备事件上报实战(继电器场景)
linux·服务器·网络·数据库·网络协议
逍遥德2 小时前
Sring事务详解之02.如何使用编程式事务?
java·服务器·数据库·后端·sql·spring
笨蛋不要掉眼泪2 小时前
Redis哨兵机制全解析:原理、配置与实战故障转移演示
java·数据库·redis·缓存·bootstrap