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 在处理大型数据时,可能会因为其文本格式导致带宽占用过大,且解析和处理速度较慢。
优点:
- 更适合处理大量数据和高频次的数据交换,减少对系统性能的影响
总结
| 特性 | Protobuf | JSON |
|---|---|---|
| 消息大小 | 更小(二进制格式) | 较大(文本格式) |
| 序列化/反序列化速度 | 更快 | 较慢 |
| 数据类型 | 强类型(需要 .proto 文件定义) | 弱类型(只存储文本) |
| 兼容性 | 良好的向前向后兼容性 | 无内建的版本控制机制 |
| 带宽消耗 | 更低 | 更高 |
| 跨语言支持 | 提供自动化代码生成,支持多种语言 | 支持多种语言,但没有标准生成机制 |
| 复杂数据结构支持 | 强大的数据类型和结构支持 | 支持嵌套结构,但缺乏类型验证机制 |
| 适用场景 | 高效、大数据、跨平台系统 | 简单的配置文件、日志文件、Web API |
总结:Protobuf 相对 JSON 的主要优点在于更小的消息体积、更快的序列化速度、类型安全、带宽消耗更低以及更好的跨语言支持等。对于需要高效数据交换、大规模数据处理以及高性能要求的系统,Protobuf 是一个更为理想的选择。而对于简单的配置文件、调试或人类可读的日志文件等场景,JSON 仍然是一个很好的选择,尤其是它的可读性和易于操作的特点。
相关文章:
cJson——序列化格式json和protobuf对比
cJson——序列化格式json和protobuf对比 1. 更小的消息体积2. 更快的序列化与反序列化速度3. 类型安全4. 向后和向前兼容性5. 更低的带宽消耗6. 高效的编码方式7. 易于跨语言支持8. 支持复杂的数据结构9. 更好的支持大型数据交换总结 Protocol Buffers (Protobuf) 和 JSON 都是…...
搭建一个fastapi的项目,调用ollama服务
1. 项目结构 my_project/ │ ├── app/ │ ├── main.py # FastAPI应用的入口 │ ├── services/ # 包含服务逻辑 │ │ └── ollama_service.py │ ├── models/ # 定义数据模型 │ │ └── response.py │ ├─…...
Wireshark编译手册(Windows)
以下是对 Wireshark 官方文档中“Windows 平台的设置和构建说明”部分的翻译和总结: 2.2. Windows 平台 本节提供了在 Windows 上进行 Wireshark 开发的快速设置指南,包含推荐的配置。 2.2.1. 使用 Microsoft Visual Studio 注意:除非您非…...
在高德地图上加载3DTilesLayer图层模型/天地瓦片
1. 引入必要的库 Three.js:一个用于创建和显示3D图形的JavaScript库。vuemap/three-layer:一个Vue插件,它允许你在高德地图中添加Three.js图层。vuemap/layer-3dtiles:一个用于处理3D Tiles格式数据的Vue插件,可以用来…...
深入浅出负载均衡:理解其原理并选择最适合你的实现方式
负载均衡是一种在多个计算资源(如服务器、CPU核心、网络链接等)之间分配工作负载的技术,旨在优化资源利用率、提高系统吞吐量和降低响应时间。负载均衡的实现方式多种多样,以下是几种常见的实现方式: 1. 硬件负载均衡&…...
STM32的存储结构
STM32F103 芯片是基于 ARM Cortex-M3 内核的微控制器,它集成了多种类型的存储器,每种存储器都有其特定的作用和存储对象。以下是关于 STM32F103 中 Flash、ROM 和 SRAM 的详细介绍: 1. Flash Memory (闪存) 作用:Flash 是非易失性…...
@SneakyThrows 注解详解
SneakyThrows 注解详解 1. 基本介绍 SneakyThrows 是 Lombok 提供的注解,用于简化异常处理,自动生成 try-catch 代码块,将检查型异常转换为非检查型异常。 2. 使用对比 2.1 传统写法 public String readFile(String path) {try {return …...
js监测页面可见性
监测切换页面 检测页面的可见性状态document.visibilityState:document.hiddenvisibilitychange 事件 js 检测页面切换至别的应用 检测页面的可见性状态 在JavaScript中,你可以使用Page Visibility API来检测页面的可见性状态。这个API提供了一组接口,允…...
Android wifi常见问题及分析
参考 Android Network/WiFi 那些事儿 前言 本文将讨论几个有意思的网络问题,同时介绍 Android 上常见WiFi 问题的分析思路。 网络基础Q & A 一. 网络分层缘由 分层想必大家很熟悉,是否想过为何需要这样分层? 网上大多都是介绍每一层…...
EFCore HasDefaultValueSql
今天小伙伴在代码中遇到了有关 HasDefaultValue 的疑问,这里整理澄清下... 在使用 Entity Framework Core (EFCore) 配置实体时,HasDefaultValue 方法会为数据库列设置一个默认值。该默认值的行为取决于以下条件: 1. 配置 HasDefaultValue 的…...
Win10微调大语言模型ChatGLM2-6B
在《Win10本地部署大语言模型ChatGLM2-6B-CSDN博客》基础上进行,官方文档在这里,参考了这篇文章 首先确保ChatGLM2-6B下的有ptuning AdvertiseGen下载地址1,地址2,文件中数据留几行 模型文件下载地址 (注意࿱…...
什么叫区块链?怎么保证区块链的安全性?
区块链(Blockchain)是一种分布式数据库或账本技术,它通过去中心化的方式记录交易或其他数据,并确保这些记录是安全、透明和不可篡改的。区块链最初是作为比特币(Bitcoin)加密货币的基础技术而被公众所知&am…...
一、智能体强化学习——强化学习基础
1.1 强化学习与深度学习的基本概念 1.1.1 强化学习的核心思想 什么是强化学习? 强化学习(Reinforcement Learning, RL):指在与环境(Environment)的反复交互中,智能体(Agent&#x…...
【DES加密】
什么是DES DES(Data Encryption Standard) 是一种对称加密算法。它的设计目标是提供高度的数据安全性和性能。 DES的概念 DES使用56位的密钥和64位的明文块进行加密。DES算法的分组大小是64位,因此,如果需要加密的明文长度不足64位,需要进…...
.NET中的框架和运行环境
在.NET生态系统中,框架和运行环境是两个不同的概念,它们各自扮演着重要的角色。 下面我将分别介绍.NET中的框架和运行环境,并解释它们之间的区别。 .NET 框架(Frameworks) 框架提供了一套预定义的类库、工具和服务&…...
探索微软 M365 安全:全方位守护数字世界
在当今这个科技呈井喷式飞速发展,数字化浪潮以汹涌澎湃、锐不可当之势席卷全球的时代,企业与个人仿若置身于一片浩瀚无垠、信息奔涌的海洋之中,尽情畅享着技术革新所带来的无穷无尽便利。然而,恰如平静海面下潜藏着暗礁与汹涌暗流,网络安全问题恰似隐匿在暗处、随时可能给…...
深入探索AI核心模型:CNN、RNN、GAN与Transformer
在人工智能的飞速发展中,众多深度学习模型和算法不断涌现,推动了许多领域的进步。特别是在图像识别、自然语言处理、生成建模等方向,AI模型的应用越来越广泛。本文将介绍几种最常用的AI模型,包括卷积神经网络(CNN&…...
Java - Http 通讯
Java - Http 通讯 PS: 1. Http 协议 POST | GET 请求; 2. 支持 报头、报文、参数 自定义配置; 3. GET 返回支持 String | Stream; 4. 相关依赖: <dependency><groupId>org.apache.httpcomponents</groupId><…...
C++ Qt练习项目 QChar功能测试
个人学习笔记 代码仓库 GitCode - 全球开发者的开源社区,开源代码托管平台 新建项目 设计UI 1、拖入group box去掉名字 2、拖入2个LineEdit 3、拖入两个Label 4、拖入两个PushButton 5、点栅格布局 1、拖入GroupBox 2、拖入4个PushButton 3、点栅格布局 1、拖入GroupBo…...
android 官网刷机和线刷
nexus、pixel可使用google官网线上刷机的方法。网址:https://flash.android.com/ 本文使用google线上刷机,将Android14 刷为Android12 以下是失败的线刷经历。 准备工作 下载升级包。https://developers.google.com/android/images?hlzh-cn 注意&…...
嵌入式开发中的模块化编程与驱动分离实践
1. 模块化编程与驱动分离的核心价值在嵌入式开发领域,模块化编程早已不是新鲜概念。我第一次真正体会到它的威力是在2016年参与某新能源汽车BMS(电池管理系统)开发时。当时团队里有8个工程师同时开发不同功能模块,如果没有严格的模…...
基于Matlab的多自由度轴承静刚度计算之旅
基于Matlab的多自由度轴承静刚度计算 因分析静态下刚度结果,仅考虑重力作用,未考虑离心力的作用 深沟球轴承和圆锥轴承基本参数包括滚珠数量、滚珠直径、中称直径、曲率和材料参数 程序已调通,可直接运行在机械工程领域,深入了解轴…...
AI 模型调度平台的系统架构
AI模型调度平台的系统架构:智能时代的核心引擎 在人工智能技术飞速发展的今天,AI模型调度平台成为企业实现智能化转型的关键基础设施。它通过高效管理、调度和优化AI模型资源,帮助用户快速部署和运行复杂的AI任务。本文将深入解析AI模型调度…...
手把手教你用Matlab/Simulink实现PMSM FOC控制(附SVPWM算法代码)
从零构建PMSM磁场定向控制:Matlab/Simulink实战指南 在工业驱动和电动汽车领域,永磁同步电机(PMSM)凭借其高功率密度和卓越效率成为首选。而磁场定向控制(FOC)作为当前最先进的电机控制策略,能实…...
从配准到生成:扩散模型如何革新医学图像跨模态转换
1. 医学图像跨模态转换的技术挑战 医学影像领域长期面临一个核心难题:如何在不同成像模态之间实现高精度转换。比如将核磁共振(MRI)的软组织图像转换为计算机断层扫描(CT)的骨骼结构图像,这种需求在放射治…...
用Python+ddddocr搞定某税网滑块验证码,再拆解SM2/SM4/HMacSHA256加密全流程
Python实战:国密算法与滑块验证的自动化登录全解析 当开发者遇到集成了滑块验证和国密加密的复杂登录系统时,传统爬虫手段往往束手无策。本文将完整演示如何用Python构建一个从滑块识别到加密处理的自动化登录系统,重点解决SM2/SM4加密和HMac…...
【openbmc8】mctp pldm
文章目录 1.mctp协议 1.1 mctp通用报文 1.2 mctp over i2c packet format 2.驱动分析 2.1 mctp pcie vdm 2.1 用户层操作代码流程 2.2 用户层操作测试 3.dbus适配 1.mctp协议 1.1 mctp通用报文 谁分配EID谁就是bus owner。mctp建立关联后都用EID(类似ip地址)通信:下图最后…...
红蓝对抗深度解析:从技术体系到落地实践,企业安全真正的实战课
红蓝对抗深度解析:从技术体系到落地实践,企业安全真正的实战课 在数字化攻防进入 “实战对抗” 时代的今天,红蓝对抗已成为企业检验安全防御体系、提升应急响应能力的核心手段。不同于传统的漏洞扫描和合规检查,红蓝对抗以 “高仿…...
cool-admin(midway版)数据权限过滤:实现方案与对比
cool-admin(midway版)数据权限过滤:实现方案与对比 【免费下载链接】cool-admin-midway 🔥 cool-admin(midway版)一个很酷的后台权限管理框架,模块化、插件化、CRUD极速开发,永久开源免费,基于midway.js 3.x、typescri…...
11. v4 版本升级指南
11. v4 版本升级指南 1. 概述 Tailwind CSS v4 是一个重大版本更新,从 JavaScript 配置转向 CSS 优先的配置方式。 1.1 主要变化 变化v3v4配置方式tailwind.config.jsCSS 文件 (theme)安装方式postcss tailwindcsstailwindcss/vite 等暗色模式dark: 前缀相同&a…...
