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 注意&…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...

Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...

算术操作符与类型转换:从基础到精通
目录 前言:从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符:、-、*、/、% 赋值操作符:和复合赋值 单⽬操作符:、--、、- 前言:从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...

aardio 自动识别验证码输入
技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”,于是尝试整合图像识别与网页自动化技术,完成了这套模拟登录流程。核心思路是:截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…...
2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案
一、延迟敏感行业面临的DDoS攻击新挑战 2025年,金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征: AI驱动的自适应攻击:攻击流量模拟真实用户行为,差异率低至0.5%,传统规则引…...