序列化和反序列化:从理论到实践的全方位指南

news2025/5/18 22:08:09

你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益:

  1. 了解大厂经验
  2. 拥有和大厂相匹配的技术等

希望看什么,评论或者私信告诉我!

文章目录

    • 一、 背景
    • 二、什么是序列化 和 反序列化
    • 三、序列化和普通的字符编码转换的区别:
    • 三、 为什么需要序列化
      • 3.1 序列化的核心价值
      • 3.2、不序列化网络传输的核心问题
    • 四、常见的序列化对比
    • 五、总结

一、 背景

上一篇文章,我们了解了网络模型 OSI 和 TCP/IP的联系和区别,今天结合TCP/IP 聊一下 序列化的应用过程

二、什么是序列化 和 反序列化

简单来说,序列化就是把一个Java对象转换成一系列字节的过程,这些字节可以被存储到文件、数据库,或者通过网络传输。反过来,反序列化则是把这些字节重新转换成Java对象的过程。

想象一下,你有一个手机应用中的用户对象(比如用户的名字、年龄等信息)。如果你想将这个用户对象存储起来,或者发送给服务器,你就需要先序列化它。等到需要使用的时候,再通过反序列化把它恢复成原来的对象。

三、序列化和普通的字符编码转换的区别:

  • 序列化(Serialization):
  1. 是将整个对象的状态(包括其属性、关系等)转换为字节序列
  2. 目的是保存/传输对象的完整状态,以便之后可以重建对象
  3. 包含对象的类型信息、属性结构等元数据
  • 字符编码转换
  1. 仅是将字符按照编码规则转换为字节
  2. 不包含任何元数据或类型信息
  3. 只是一种字符到字节的映射转换

三、 为什么需要序列化

从网络层来说的话,数据在网络中传输都是以二进制的形式,所以要么你自己手动序列化,要么框架帮你序列化,比如 Flink 在分布式计算中对 java 对象的序列化

3.1 序列化的核心价值

1. 跨平台与跨语言兼容性
序列化通过将对象状态转换为与架构无关的标准化格式(如二进制流或JSON),解决了不同硬件架构、操作系统和编程语言之间的兼容性问题。例如:
• 内存布局差异:直接传输内存指针会因32位/64位系统对齐方式不同导致解析错误。

• 数据表示统一:二进制协议(如Protobuf)通过TLV编码消除字节顺序(大端/小端)影响,确保跨平台数据一致性。

2. 数据完整性与持久化
序列化能完整保存对象状态(包括私有字段和嵌套对象),而不仅仅是基础数据。例如:
• 复杂对象持久化:Java的Serializable接口通过递归序列化对象及其引用的所有对象,实现深复制。

• 恢复能力:将用户会话数据序列化后存入Redis,重启服务时可精确重建状态。

3. 网络传输效率优化
序列化通过压缩数据体积和减少冗余提升传输效率:
• 体积对比:Protobuf的二进制编码体积仅为JSON的1/3,节省带宽。

• 性能优势:Spark使用Kryo序列化将内存占用减少50%,反序列化速度提升2倍。

3.2、不序列化网络传输的核心问题

1. 数据解析失败与结构混乱
• 内存布局不可控:直接传输结构体可能导致不同平台的内存对齐差异(如C++结构体在32位/64位系统下占用不同空间)。

• 私有字段丢失:未序列化的对象可能因语言特性(如Java反射机制未启用)无法访问私有字段。

2. 性能与资源浪费
• 冗余数据开销:未压缩的内存对象包含元数据(如类名、方法签名),导致带宽浪费。例如,Java原生序列化体积比Protobuf大30%以上。

• 解析效率低下:文本格式(如XML)需逐字符解析,耗时是二进制协议的5-10倍。

3. 安全与稳定性风险
• 反序列化攻击:未经验证的字节流可能触发恶意代码(如Java的readObject()漏洞)。

• 版本兼容性崩溃:未定义serialVersionUID的类在字段增减后,反序列化会因版本不匹配抛出异常。

三、典型场景对比

场景使用序列化不使用序列化
分布式服务调用通过gRPC + Protobuf实现跨语言通信,延迟低于5ms需手动拼接字符串或结构体,易因平台差异解析失败(如C++结构体在Python端无法读取)
数据库存储对象序列化为BLOB字段(如Java的Serializable),支持嵌套对象持久化仅能存储基础类型字段,复杂对象需拆分为多表,维护成本高
缓存系统Redis通过MessagePack存储会话对象,反序列化速度比JSON快2倍缓存仅支持字符串键值,复杂对象需多次查询拼接,增加I/O压力

四、如何选择序列化方案?

  1. 性能敏感场景:选择二进制协议(如Protobuf、FlatBuffers),适用于高并发微服务。
  2. 可读性优先场景:使用JSON/XML,适合API调试或配置文件。
  3. 跨语言需求:Thrift、Avro提供多语言IDL支持,适合混合技术栈。
  4. 安全性要求:避免Java原生序列化,采用加密协议(如Protobuf + TLS)。

四、常见的序列化对比

常见序列化协议全面对比与应用场景选择指南

一、核心协议特性对比

协议核心优势主要缺陷适用场景
JSON可读性强、全语言原生支持、动态扩展性好体积大(比Protobuf大2-3倍)、性能较低(解析速度约5us/次)前后端API交互、移动端通信、配置文件
Protobuf性能顶级(序列化速度比JSON快8倍)、体积最小(比JSON小25%)、版本兼容性强需预编译.proto文件、调试困难(二进制不可读)、动态类型支持弱高并发微服务(如gRPC)、大数据存储(Hadoop/Spark)、跨防火墙通信
Thrift内置RPC框架、支持30+语言、字段增删兼容性好开发复杂(需生成代码)、不支持HTTP协议集成、线程安全性差跨语言服务网格(如Java-PHP混合架构)、金融交易系统
MessagePack二进制体积比JSON小50%、解析速度比JSON快3倍、兼容JSON数据结构不支持复杂嵌套模型、依赖字段顺序维护、跨语言模型同步困难Redis缓存会话、移动端数据传输、IoT设备通信
XML树形结构清晰、支持命名空间、企业级标准兼容体积最大(比JSON大20%)、解析速度最慢(100us/次)、冗余标签多传统银行系统、Office文档格式(如Word/Excel)、遗留系统集成

二、应用场景

  1. 性能优先场景
    • 选择Protobuf:适用于要求<50ms响应时间的微服务调用(如电商秒杀系统)

    • 备选MessagePack:适合简单数据结构的实时传输(如智能家居设备状态上报)

  2. 跨语言RPC需求
    • 选择Thrift:提供完整的服务发现、负载均衡等RPC生态(如跨Java/Python的支付系统)

    • 备选gRPC+Protobuf:需要HTTP/2协议支持时优先考虑(如Kubernetes服务通信)

  3. 可读性优先场景
    • 选择JSON:前后端联调、第三方开放API(如天气预报接口)

    • 备选XML:需严格数据校验时使用(如银行SWIFT报文)

  4. 存储优化场景
    • 列式存储选Protobuf:HDFS中存储PB级日志(如用户行为分析数据)

    • 文档存储选Avro:Hive表结构动态扩展时更优(如数据仓库分层存储)

三、协议扩展性设计原则

  1. 版本兼容策略
    • Protobuf采用字段编号机制(新增字段用optional,删除字段标记reserved
    • JSON通过@version元数据字段实现多版本共存(需手动处理废弃字段)

  2. 安全加固方案
    • 敏感字段加密:对Protobuf的bytes类型使用AES-GCM加密
    • 完整性校验:Thrift数据包末尾追加HMAC签名

四、典型错误规避建议

  1. Java原生序列化陷阱
    • 避免直接使用Serializable接口:存在远程代码执行漏洞(如Log4j反序列化攻击)
    • 替代方案:改用Kryo(性能提升3倍)或FST(零拷贝优化)

  2. MessagePack使用误区
    • 禁止嵌套复杂对象:如订单含用户画像数据时改用Protobuf
    • 字段顺序强制约定:跨语言场景需同步.msg定义文件

五、总结
• 新项目:微服务优先Protobuf,Web应用主用JSON,IoT设备选MessagePack

• 遗留系统:Java序列化迁移至Kryo,XML逐步替换为JSON Schema

• 大数据场景:Hadoop生态用Avro,实时计算用Protobuf

五、总结

序列化是将对象转换为字节序列的过程,用于数据存储、网络传输和跨平台通信。它与字符编码转换不同,包含对象的完整状态和元数据。序列化的重要性体现在跨平台兼容性、数据完整性和网络传输效率等方面。文章对比了多种序列化协议,提供了选择建议和应用场景指南,帮助开发者根据需求选择合适的序列化方案。同时,还介绍了协议扩展性设计原则和常见错误的规避方法,为实际应用提供了参考。

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

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

相关文章

开源RTOS(实时操作系统):nuttx 编译

开源RTOS&#xff08;实时操作系统&#xff09;&#xff1a;nuttx 编译 手册&#xff1a;Installing — NuttX latest documentation 源码&#xff1a;GitHub - apache/nuttx: Apache NuttX is a mature, real-time embedded operating system (RTOS) Installing The fir…

python打包exe报错:处理文件时错误:Excel xlsx file; not supported

背景&#xff1a;最近用python写一个excel解析工具&#xff0c;然后打包成exe可执行文件的时候&#xff0c;遇到这样的问题 1.在我自己编译器运行是可以正常将上传后的excel进行解析&#xff0c;但是在打包成exe后&#xff0c;就无法正常解析excel 问题排查&#xff1a; 1.切换…

VUE3 -综合实践(Mock+Axios+ElementPlus)

目录 前言 目标 1.工程创建 2.Mock 2.1 配置Mock 扩 展 2.2 定义模拟数据 2.3 创建Mock服务器 3.导入ElementPlus 4.表格页面搭建 5.动态路由跳转 6.详情页面的制作 前言 基于前文 VUE3详细入门&#xff0c;我们对VUE3的基本使用有了初步的了解&#xff0c;下…

NDS3211HV单路H.264/HEVC/HD视频编码器

1产品概述 NDS3211HV单路高清编码器是一款功能强大的音/视频编码设备&#xff0c;支持2组立体声&#xff0c;同时还支持CC(CVBS)字幕。支持多种音频编码方式。该设备配备了多种音/视频输入接口&#xff1a;HD-SDI数字视频输入、HDMI高清输入&#xff08;支持CC&#xff09;、A…

LeetCode热题100--206.反转链表--简单

1. 题目 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1] 示例 3&…

来一个复古的技术FTP

背景 10年前的老代码&#xff0c;需要升级springboot框架&#xff0c;在升级过程中&#xff0c;测试业务流程里&#xff0c;有FTP的下载业务&#xff0c;不管测试环境如何测试&#xff0c;都没有成功&#xff0c;最后只能自己搭建一个FTP服务器&#xff0c;写一个ftp-demo来测试…

OpenWebUI新突破,MCPO框架解锁MCP工具新玩法

大家好&#xff0c;Open WebUI 迎来重要更新&#xff0c;现已正式支持 MCP 工具服务器&#xff0c;但 MCP 工具服务器需由兼容 OpenAPI 的代理作为前端。mcpo 是一款实用代理&#xff0c;经测试&#xff0c;它能让开发者使用 MCP 服务器命令和标准 OpenAPI 服务器工具&#xff…

TRTC实时对话式AI解决方案,助力人机语音交互极致体验

近年来&#xff0c;AI热度持续攀升&#xff0c;无论是融资规模还是用户热度都大幅增长。2023 年&#xff0c;中国 AI 行业融资规模达2631亿人民币&#xff0c;较2022年上升51%&#xff1b;2024年第二季度&#xff0c;全球 AI 初创企业融资规模为 240 亿美金&#xff0c;较第一季…

Linux安全篇 --firewalld

一、Firewalld 防火墙概述 1、Firewalld 简介 firewalld 的作用是为包过滤机制提供匹配规则(或称为策略)&#xff0c;通过各种不同的规则告诉netfilter 对来自指定源、前往指定目的或具有某些协议特征的数据包采取何种处理方式为了更加方便地组织和管理防火墙,firewalld 提供…

系分论文《论系统需求分析方法及应用》

系统分析师论文范文系列 【摘要】 2022年6月&#xff0c;我作为系统分析师参与了某金融机构“智能信贷风控系统”的建设项目。该系统旨在通过对业务流程的数字化重构&#xff0c;优化信贷审批效率并降低风险。项目涉及信贷申请、资质审核、风险评估、额度审批等核心流程&#x…

LIIGO ❤️ RUST: 12 YEARS

LIIGO &#x1f496; RUST: 12 YEARS 今天是RUST语言1.0发布十周年纪念日。十年前的今天&#xff0c;2015年的今天&#xff0c;Rust 1.0 正式发行。这是值得全球Rust支持者隆重纪念的日子。我借此机会衷心感谢Rust语言创始人Graydon Hoare&#xff0c;Mozilla公司&#xff0c;…

Trivy:让你时刻掌控的开源安全扫描器

深入了解 Trivy:全面的安全扫描工具 在如今互联网快速发展的时代,软件的安全性显得尤为重要。随着应用程序的复杂性增加,其可能带来的安全漏洞也在不断增多。如何快速、准确地发现这些潜在威胁是每个开发者和运维人员心中的课题。今天,我们将为大家介绍一个开源的安全扫描…

LlamaIndex 第八篇 MilvusVectorStore

本指南演示了如何使用 LlamaIndex 和 Milvus 构建一个检索增强生成&#xff08;RAG&#xff09;系统。 RAG 系统将检索系统与生成模型相结合&#xff0c;根据给定的提示生成新的文本。该系统首先使用 Milvus 等向量相似性搜索引擎从语料库中检索相关文档&#xff0c;然后使用生…

2022河南CCPC(前四题)

签到题目 #include <bits/stdc.h> using namespace std; #define int long long #define PII pair<int,int> #define fi first #define se second #define endl \n #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);void solve() {int n;cin>>…

谷歌浏览器(Google Chrome)136.0.7103.93便携增强版|Win中文|安装教程

软件下载 【名称】&#xff1a;谷歌浏览器&#xff08;Google Chrome&#xff09;136.0.7103.93 【大小】&#xff1a;170M 【语言】&#xff1a;简体中文 【安装环境】&#xff1a;Win10/Win11 【夸克网盘下载链接】&#xff08;务必手机注册&#xff09;&#xff1a; h…

高可用消息队列实战:AWS SQS 在分布式系统中的核心解决方案

引言&#xff1a;消息队列的“不可替代性” 在微服务架构和分布式系统盛行的今天&#xff0c;消息队列&#xff08;Message Queue&#xff09; 已成为解决系统解耦、流量削峰、异步处理等难题的核心组件。然而&#xff0c;传统的自建消息队列&#xff08;如RabbitMQ、Kafka&am…

「Mac畅玩AIGC与多模态41」开发篇36 - 用 ArkTS 构建聚合搜索前端页面

一、概述 本篇基于上一节 Python 实现的双通道搜索服务&#xff08;聚合 SearxNG 本地知识库&#xff09;&#xff0c;构建一个完整的 HarmonyOS ArkTS 前端页面。用户可在输入框中输入关键词&#xff0c;实时查询本地服务 http://localhost:5001/search?q...&#xff0c;返…

springCloud/Alibaba常用中间件之Seata分布式事务

文章目录 SpringCloud Alibaba:依赖版本补充Seata处理分布式事务(AT模式)AT模式介绍核心组件介绍AT的工作流程&#xff1a;两阶段提交&#xff08;**2PC**&#xff09; Seata-AT模式使用Seata(2.0.0)下载、配置和启动Seata案例实战前置代码添加全局注解 GlobalTransactional Sp…

Datawhale FastAPI Web框架5月第1次笔记

原课程地址&#xff1a; FastAPI Web框架https://www.datawhale.cn/learn/summary/164本次难点&#xff1a; 切换python的版本为3.10 作业过程 启动&#xff1a; jupyter notebook 首先我们要确保自己的python版本是3.10 import sys print(sys.version) 第一个fastapi…

操作系统:os概述

操作系统&#xff1a;OS概述 程序、进程与线程无极二级目录三级目录 程序、进程与线程 指令执行需要那些条件&#xff1f;CPU内存 需要数据和 无极 二级目录 三级目录