深入解析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
英文地址,請注明出處:http://en.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;主要兩點是亮點&…