当前位置: 首页 > news >正文

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 在处理大型数据时,可能会因为其文本格式导致带宽占用过大,且解析和处理速度较慢。

优点

  • 更适合处理大量数据和高频次的数据交换,减少对系统性能的影响

总结

特性ProtobufJSON
消息大小更小(二进制格式)较大(文本格式)
序列化/反序列化速度更快较慢
数据类型强类型(需要 .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,文件中数据留几行 模型文件下载地址 (注意&#xff1…...

什么叫区块链?怎么保证区块链的安全性?

区块链(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&#xff1a; 1. Http 协议 POST | GET 请求&#xff1b; 2. 支持 报头、报文、参数 自定义配置&#xff1b; 3. GET 返回支持 String | Stream; 4. 相关依赖&#xff1a; <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官网线上刷机的方法。网址&#xff1a;https://flash.android.com/ 本文使用google线上刷机&#xff0c;将Android14 刷为Android12 以下是失败的线刷经历。 准备工作 下载升级包。https://developers.google.com/android/images?hlzh-cn 注意&…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 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&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...