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 注意&…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
