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 数组时,类型不一致可能会带来逻辑问题。

{"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)指的是新版本的客户端服务端能够解析旧版本数据中的已知字段,而不会因缺少字段导致错误。这种兼容性通常是在删除或弃用字段时体现。被移除的字段在解析时为空。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/59364.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker 启动 neo4j

docker 启动 neo4j 1. 启动2. 导入数据 1. 启动 运行下面命令启动 neo4j, docker run \-d \--restartalways \--publish7474:7474 --publish7687:7687 \--volume$HOME/neo4j-4.4.38/data:/data \--name neo4j-apoc-4.4.38 \-e NEO4J_dbms_allow__upgradetrue \-e …

鸿蒙HarmonyOS开发:系统服务

拨打电话 call.makeCall 跳转到拨号界面&#xff0c;并显示待拨出的号码。使用callback异步回调。 makeCall(phoneNumber: string, callback: AsyncCallback<void>): voidimport { call } from kit.TelephonyKit;import { BusinessError } from kit.BasicServicesKit;c…

Java基础06(代码运行时的内存图)

目录 一、引入 二、Java下的内存分配 1.类信息常量池和静态常量池 2. 栈和字符串常量池 &#xff08;引进&#xff09;线程 3.⭐程序计数器作用⭐&#xff08;程序计数器配合栈使用&#xff09; 总结Java内存&#xff1a; &#xff08;引进&#xff09;驱动 三、引用传…

论文阅读-用于点云分析的自组织网络

目前存在的问题&#xff1a; 原始的SOM&#xff08;1&#xff09;训练结果与初始节点高度相关&#xff08;2&#xff09;样本更新规则取决于输入点的顺序3D 卷积神经网络&#xff08;需要将数据转换为体素&#xff0c;存在分辨率损失和计算成本上涨的问题&#xff09;、PointN…

数据结构之二叉树前序,中序,后序习题分析(递归图)

1.比较相同的树 二叉树不能轻易用断言&#xff0c;因为树一定有空 2.找结点值 3.单值二叉树 4.对称二叉树 5.前序遍历

【JavaScript】JavaScript开篇基础(4)

1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ 亲爱的朋友们&#x1f44b;&#x1f44b;&#xff0c;这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章&#xff0c;请别吝啬你的点赞❤️❤️和收藏&#x1f4d6;&#x1f4d6;。如果你对我的…

运动控制 直流有刷电机

文章目录 一、简介二、组成三、特点四、电机参数4.1 额定电压4.2 额定电流4.3 额定转速4.4 额定扭矩4.5 减速比 五、工作原理5.1 左手定则5.2 工作原理 六、测速原理6.1 磁电式编码器6.2 光电式编码器 一、简介 直流有刷电机是一种内含电刷装置能将直流电转换为机械能的电机&a…

58. 最后一个单词的长度 双指针的思想

给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大 子字符串 。 示例 1&#xff1a; 输入&#xff1a;s "Hello World" 输出&#xff…

关于模拟方法建模的一份介绍

有些时候&#xff0c;我们无法直接收集大量数据&#xff0c;即对于对象的行为直接观测或重复实验可能是不行的&#xff0c;所以此时就需要通过模拟的技术来收集数据&#xff0c;然后建模。这样的一种策略就是模拟方法建模&#xff0c;而模拟方法建模中最常用的一种方法就是蒙特…

c++ 贪心算法

概念 贪心算法是一种在每一步选择中都选择当前最优解的算法策略。这种方法适用于某些特定问题&#xff0c;可以通过局部最优选择构建全局最优解。 特点 局部最优选择&#xff1a;每一步选择都选择当前看起来最优的解。无后效性&#xff1a;当前选择不会影响未来选择的可能性…

硬件常识

目录 示波器用万用表测三极管端子 示波器 示波器的夹子 鳄鱼夹接 负 钩子 接正 用万用表测三极管端子 (万用表调至二极管档/蜂鸣档) 测NPN三极管 先找到基级对应的引脚(红表笔接在基级时&#xff0c;黑表笔接在其他任一端子都有导通电压)集电结导通电压略大于发射结 (因为发…

Java 入门

目录 Java简介 Java JDK开发环境配置 第一个Java程序 Java标识符与关键字 Java注释 Java常量 Java变量的定义和使用 Java简介 Java简介&#xff1a; Java是由Sun Microsystems公司于1995年推出的一门面向对象的高级程序设计语言&#xff0c;可以运行于多个平台&#xff0c;其…

CSS--两列网页布局,三列布局和多行多列布局

两列网页布局 两列网页布局实验 先将一个未运用浮动效果的网页结构写出来 <style>header{/* 给页眉设置宽高和样式 */width:1000px;height: 40px;background-color: gray;border: 3px brown solid;margin-bottom: 5px;}article{width:1000px;height: 600px;background-c…

开源与商业的碰撞TPFLOW与Gadmin低代码的商业合作

随着数字化转型的浪潮席卷全球&#xff0c;企业对于高效、灵活的软件开发需求愈发迫切。低代码开发平台应运而生&#xff0c;为企业提供了简化开发流程、缩短开发周期的解决方案。在众多低代码开发平台中&#xff0c;Gadmin企业级低代码平台、TPFLOW工作流和SFDP超级表单脱颖而…

Edge浏览器提示“无法安全下载”

Edge浏览器在下载某些文件时&#xff0c;会提示“无法安全下载”。 注意事项&#xff1a;如果确实需要下载该文件&#xff0c;首先核对网址&#xff0c;确保下载文件的安全性&#xff0c;并在下载完成后进行必要的病毒查杀。 解决方法&#xff1a; 点击右侧的3个点&#xff0…

能通过Ping命令访问CentOS 9 Stream,但在使用Xshell连接

能通过Ping命令访问CentOS 9 Stream&#xff0c;但在使用Xshell进行SSH连接失败 1. **确认SSH服务状态**&#xff1a;2. **检查SSH配置**&#xff1a;要检查和设置PermitRootLogin选项&#xff0c;您需要编辑SSH配置文件/etc/ssh/sshd_config。以下是具体步骤&#xff1a;1. 打…

微服务系列三:微服务核心——网关路由

目录 前言 一、登录存在的问题归纳 二、*微服务网关整体方案 三、认识微服务网关 四、网关鉴权实现 五、OpenFeign微服务间用户标识信息传递实现 六、微服务网关知识追问巩固 前言 本篇文章具体讲解微服务中网关的实现逻辑、用于解决什么样的问题。其中标题中标注* 涉…

【经验分享】EasyExcel实现自定义动态化导出excel

需求&#xff1a; 需求涉及保存设备的灵活属性&#xff0c;设备的属性并不固定。允许设备的属性动态扩展。最终数据库采用EAV 模型的设计模式&#xff0c;使用三张表实现&#xff1a;设备表 、属性定义表、属性值表。 现在堆上述数据进行导入和导出。 解决&#xff1a; 这里使…

Docker入门系列——网络

Docker 通过容器化应用程序&#xff0c;彻底改变了我们构建、分发和运行应用程序的方式。然而&#xff0c;有效使用 Docker 的一个关键方面是理解容器如何相互通信以及与外界通信。 1. 什么是 Docker 网络&#xff1f; Docker 网络允许容器相互通信以及与外部资源通信。默认情况…

2024年大厂AI大模型面试题精选与答案解析

前言 随着AI市场&#xff0c;人工智能的爆火&#xff0c;在接下来的金九银十招聘高峰期&#xff0c;各大科技巨头和国有企业将会对AGI人才的争夺展开一场大战&#xff0c;为求职市场注入了新的活力。 为了助力求职者在面试中展现最佳状态&#xff0c;深入理解行业巨头的选拔标…