深入解析Avro、Protobuf与JSON:序列化技术的选择与应用

在现代分布式系统和数据交换场景中,序列化技术是数据存储、传输和通信的核心。本文深入探讨三种主流序列化技术:AvroProtobufJSON,从背景、特点、示例代码(Python)、优势及最佳实践等多个维度进行对比分析,帮助开发者根据业务需求选择合适的序列化方案。

1. 背景与概述

1.1 JSON(JavaScript Object Notation)

JSON 是一种轻量级的数据交换格式,基于文本,易于人类阅读和编写,同时也易于机器解析和生成。它广泛应用于 Web API、配置文件和简单数据存储。

1.2 Protobuf(Protocol Buffers)

Protobuf 是 Google 开发的一种二进制序列化格式,具有高效、紧凑的特点,适用于高性能 RPC 和数据存储。它需要预先定义 Schema(.proto 文件),并通过编译器生成代码。
在这里插入图片描述

1.3 Avro

Avro 是 Apache 开发的一种数据序列化系统,支持动态 Schema 和二进制编码,特别适合大数据场景(如 Hadoop、Kafka)。它结合了 JSON 的灵活性和 Protobuf 的高效性。

在这里插入图片描述

2. 特点对比

特性JSONProtobufAvro
数据格式文本(可读性强)二进制(高效紧凑)二进制(支持动态 Schema)
Schema 支持无(隐式结构)需要 .proto 文件支持动态 Schema
性能较低(解析慢,体积大)高(解析快,体积小)高(解析快,体积小)
适用场景Web API、配置文件RPC、高性能存储大数据、流式处理
语言支持所有语言所有语言(需生成代码)所有语言(动态 Schema)

3. 示例代码(Python)

3.1 JSON 示例

import json# 定义数据
data = {"name": "Alice", "age": 30, "city": "New York"}# 序列化(JSON → 字符串)
json_str = json.dumps(data)
print("JSON Serialized:", json_str)# 反序列化(字符串 → JSON)
deserialized_data = json.loads(json_str)
print("JSON Deserialized:", deserialized_data)

输出:

JSON Serialized: {"name": "Alice", "age": 30, "city": "New York"}
JSON Deserialized: {'name': 'Alice', 'age': 30, 'city': 'New York'}

3.2 Protobuf 示例

首先定义 .proto 文件(person.proto):

syntax = "proto3";message Person {string name = 1;int32 age = 2;string city = 3;
}

然后编译并生成 Python 代码:

protoc --python_out=. person.proto

使用生成的代码进行序列化:

import person_pb2# 创建对象
person = person_pb2.Person()
person.name = "Bob"
person.age = 25
person.city = "San Francisco"# 序列化(对象 → 二进制)
binary_data = person.SerializeToString()
print("Protobuf Serialized (hex):", binary_data.hex())# 反序列化(二进制 → 对象)
new_person = person_pb2.Person()
new_person.ParseFromString(binary_data)
print("Protobuf Deserialized:", new_person)

输出:

Protobuf Serialized (hex): 0a03426f621019121453616e204672616e636973636f
Protobuf Deserialized: name: "Bob" age: 25 city: "San Francisco"

3.3 Avro 示例

首先定义 Schema(user.avsc):

{"type": "record","name": "User","fields": [{"name": "name", "type": "string"},{"name": "age", "type": "int"},{"name": "city", "type": "string"}]
}

使用 Python 的 fastavro 库进行序列化:

import fastavro
from io import BytesIO# 定义 Schema
schema = {"type": "record","name": "User","fields": [{"name": "name", "type": "string"},{"name": "age", "type": "int"},{"name": "city", "type": "string"}]
}# 创建数据
data = {"name": "Charlie", "age": 35, "city": "London"}# 序列化(数据 → 二进制)
bytes_io = BytesIO()
fastavro.writer(bytes_io, schema, [data])
binary_data = bytes_io.getvalue()
print("Avro Serialized (hex):", binary_data.hex())# 反序列化(二进制 → 数据)
bytes_io = BytesIO(binary_data)
deserialized_data = fastavro.reader(bytes_io, schema)
print("Avro Deserialized:", list(deserialized_data))

输出:

Avro Serialized (hex): 06436861726c6965401f1a064c6f6e646f6e
Avro Deserialized: [{'name': 'Charlie', 'age': 35, 'city': 'London'}]

4. 优势与适用场景

4.1 JSON 的优势

易读性强:适合配置文件和调试。
✅ ​​广泛支持​​:所有编程语言和 Web 框架都支持。
❌ ​​性能较低​​:解析速度慢,数据体积大。

适用场景

  • Web API(RESTful)
  • 配置文件(如 package.json
  • 简单数据交换

4.2 Protobuf 的优势

高性能:二进制编码,解析快,体积小。
✅ ​​强类型​​:Schema 确保数据一致性。
❌ ​​需要预编译​​:需生成代码,灵活性较低。

适用场景

  • 高性能 RPC(如 gRPC)
  • 游戏数据存储
  • 微服务通信

4.3 Avro 的优势

动态 Schema:适合 schema evolution(字段增减)。
✅ ​​大数据友好​​:与 Hadoop、Kafka 深度集成。
❌ ​​依赖 Schema​​:运行时需要 Schema 文件。

适用场景

  • 大数据存储(Hadoop、Spark)
  • 流式处理(Kafka)
  • 数据仓库(如 Snowflake)

5. 最佳实践

场景推荐技术原因
Web API / 配置文件JSON易读性强,广泛支持
高性能 RPC / 存储Protobuf高效二进制编码,强类型约束
大数据 / 流式处理Avro动态 Schema 支持,与大数据生态无缝集成

总结

  • JSON 适合易读性和灵活性优先的场景(如 Web API)。
  • Protobuf 适合高性能、强类型约束的场景(如 gRPC)。
  • Avro 适合大数据和动态 Schema 的场景(如 Kafka)。

选择序列化技术时,需权衡 性能、可读性、Schema 灵活性生态系统支持。希望本文能帮助你做出更明智的决策! 🚀

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

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

相关文章

Vue 中 effectScope() 的全面解析与实战应用

一、effectScope 概述1.1 什么是 effectScopeeffectScope() 是 Vue 3.2 引入的核心 API,用于创建副作用作用域容器。它能够将多个响应式副作用(如 watch、watchEffect 和 computed)组织在一起,实现统一的生命周期管理。1.2 核心价…

嵌入式面试八股文(十六)·一文搞懂嵌入式常用名词IC、ASIC、CPU、MPU、MCU、SoC、SoPC、GPU、DSP

目录 1. IC(Integrated Circuit,集成电路) 2. ASIC(Application-Specific Integrated Circuit,专用集成电路) 3. CPU(Central Processing Unit,中央处理器) 4. M…

安全参綉25暑假第一次作业

第一天 1.首先讲了d0cker的部署, 这个是第一个Vulhub漏洞环境。所有环境都使用D0cker容器化,使其易于部署和隔离测试。 其中,国内的阿里用不了,你得搞个代理,下国外的:入门指南 | Vulhub 然后按这个…

RocketMQ源码级实现原理-消息消费总览

Overview可以看到,pull message和consume message实际上是两个过程,但是对于用户是透明的 注意这三个Offset的含义,physical offset就是commitLog中的全局偏移量分发dispatch如上图,Topic的每个queue,都绑定了唯一的一…

linux打包固件shell脚本

不打包 pack.sh解压后无父目录&#xff08;直接是文件&#xff09;生成 checksum.txt&#xff08;包含所有文件的 SHA256&#xff09;打包后 .tar.gz 移动到上级目录#!/bin/bash# 检查是否传入版本号参数 if [ -z "$1" ]; thenecho "Usage: $0 <version> …

用uniapp开发鸿蒙应用(暂停更新-根据项目更新,现在项目未开始)

1.根据博客生成.hap文件 【鸿蒙HarmonyOS开发技巧&#xff1a;如何不依赖华为商店直接安装uniapp生成的app文件&#xff1f;一键转换app至hap格式教程详解】_entry-default-signed.hap-CSDN博客 根据网络查询鸿蒙手机安装测试app&#xff0c;需要电脑命令安装 在鸿蒙HarmonyOS手…

Linux 文件系统实现层详解:原理、结构与驱动衔接

&#x1f4c2; Linux 文件系统实现层详解&#xff1a;原理、结构与驱动衔接 &#x1f3ac; 推荐搭配视频学习&#xff1a;Linux 文件系统子系统&#xff1a;三层架构全面掌握 一、为什么要重点理解文件系统实现层&#xff1f; 文件系统实现层是 Linux 文件系统的“地基”&…

区块链应用场景深度解读:金融领域的革新与突破

引言&#xff1a;区块链技术的演进与金融领域的变革区块链技术自2008年诞生以来&#xff0c;以其去中心化、不可篡改、可追溯等特性&#xff0c;在全球范围内引发了金融领域的深刻变革。从最初的数字货币实验&#xff0c;到如今在跨境支付、证券交易、供应链金融等领域的广泛应…

redisson tryLock

应用场景RLock rLock redissonClient.getLock(Constant_LOCK request.getId()); try {boolean isLocked rLock.tryLock();if (!isLocked) {throw new ServiceException(ErrConstant.OPERATION_FAILED, "请勿重复提交");}源码public interface RLock extends Lock,…

前端docx库实现将html页面导出word

前言&#xff1a;最近遇到一个需求&#xff0c;需要将页面的html导出为word文档&#xff0c;并且包含横向和竖向页面&#xff0c;并且可以进行混合方向导出。经过一段时间的实验&#xff0c;发现只有docx这个库满足这个要求。在这里记录一下实现思路以及代码。 docx官网 一、…

虚拟主机CPU占用100导致打不开的一次处理

背景 突然有一天&#xff0c;有个客户网站打不开了&#xff0c;发来这样一张图片问题排查 打开阿里云虚拟主机控制面板&#xff0c;CPU 使用率已经达到了100%&#xff0c;这说明网站已经在高负荷运转。分析访问日志发现&#xff0c;网站出现了大量循环路径&#xff0c;其 UserA…

设计模式之工厂模式:对象创建的智慧之道

工厂模式&#xff1a;对象创建的智慧之道 引言&#xff1a;为什么我们需要工厂模式&#xff1f; 在软件开发中&#xff0c;对象创建是最常见的操作之一。当代码中充满new关键字时&#xff0c;系统会面临三大痛点&#xff1a; 紧耦合&#xff1a;客户端代码直接依赖具体实现类扩…

Docker镜像制作案例

1、使用Docker commit制作镜像为ubuntu镜像提供ssh服务①&#xff1a;拉取镜像[rootopenEuler-1 ~]# docker pull ubuntu:18.04②&#xff1a;启动镜像[rootopenEuler-1 ~]# docker run --name c1 -it --rm ubuntu:18.04 bash③&#xff1a;替换aliyun源mv /etc/apt/sources.li…

KeilMDK5如何生成.bin文件

1&#xff1a;主要是要找到fromelf.exe的路径2&#xff1a;接下来要做的要视情况而定&#xff1a;选完fromelf.exe后在输入框中加个空格然后加一串字 : --bin -o ./Obj/L.bin ./Obj/L.axf&#xff0c;如下我设置的L最终会替换成项目名 3&#xff1a;去构建生成编译一下&#…

Ajax接收java后端传递的json对象包含长整型被截断导致丢失精度的解决方案

问题描述 在使用java编写代码的时候,后端返回前端的JSON对象中包含了Long长整型,前端接受的时候丢失了精度问题。 比如: 后端传递的json {"code": "200","msg": "操作成功","data":

MybatisPlus由浅入深

MyBatis-Plus&#xff08;简称 MP&#xff09;是一个 MyBatis 的增强工具&#xff0c;旨在简化开发过程。基本使用步骤1.依赖引入<!-- mysql依赖 --> <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>…

蓝牙信号强度(RSSI)与链路质量(LQI)的测量与应用:面试高频考点与真题解析

在蓝牙通信领域&#xff0c;信号强度&#xff08;RSSI&#xff09;和链路质量&#xff08;LQI&#xff09;是评估无线链路性能的核心指标。无论是智能家居设备的连接优化&#xff0c;还是工业物联网中的抗干扰设计&#xff0c;这两个指标都扮演着关键角色。本文将结合面试高频考…

PyTorch的计算图是什么?为什么绘图前要detach?

在PyTorch中&#xff0c;计算图&#xff08;Computational Graph&#xff09; 是自动求导&#xff08;Autograd&#xff09;的核心机制。理解计算图有助于解释为什么在绘图前需要使用 .detach() 方法分离张量。一、什么是计算图&#xff1f; 计算图是一种有向无环图&#xff08…

深度学习入门代码详细注释-ResNet18分类蚂蚁蜜蜂

本项目将基于PyTorch平台迁移ResNet18模型。该模型原采用ImageNet数据集&#xff08;含1000个图像类别&#xff09;进行训练。我们将尝试运用该模型对蚂蚁和蜜蜂进行分类&#xff08;这两个类别未包含在原训练数据集中&#xff09;。 本文的原始代码参考于博客深度学习入门项目…

北京饮马河科技公司 Java 实习面经

北京饮马河科技公司 Java 实习面经 本文作者&#xff1a;程序员小白条 本站地址&#xff1a;https://xbt.xiaobaitiao.top 1&#xff09; 面试官&#xff1a;我看你这块是有一个开源的项目&#xff0c;这个项目主要是做什么的&#xff1f; 我&#xff1a;主要两点是亮点&…