目录
-
- 文档说明
- 一、序列化、反序列化底层本质定义
-
- [1. 核心本源](#1. 核心本源)
- [2. 序列化(Serialize):对象 → 线性数据](#2. 序列化(Serialize):对象 → 线性数据)
- [3. 反序列化(Deserialize):线性数据 → 内存对象](#3. 反序列化(Deserialize):线性数据 → 内存对象)
- [4. 主流序列化协议分类](#4. 主流序列化协议分类)
- [5. 安全延伸:反序列化漏洞成因](#5. 安全延伸:反序列化漏洞成因)
- 二、对象与JSON字符串互转过程详解
-
- [1. 定性结论](#1. 定性结论)
- [2. 转换过程拆解](#2. 转换过程拆解)
- [3. JSON与二进制序列化核心差异](#3. JSON与二进制序列化核心差异)
- [三、结构化数据 & 线性数据:本质区别](#三、结构化数据 & 线性数据:本质区别)
-
- [1. 核心定义](#1. 核心定义)
- [2. 四大维度对比](#2. 四大维度对比)
- [3. 硬件底层根源](#3. 硬件底层根源)
- 四、从科学性、科学思维、科学思想、科学方法四层系统化梳理
-
- [1. 科学性(客观底层规律)](#1. 科学性(客观底层规律))
- [2. 科学思维(四大核心思维)](#2. 科学思维(四大核心思维))
- [3. 科学思想(三大计算机基础思想)](#3. 科学思想(三大计算机基础思想))
- [4. 科学方法(标准化落地流程)](#4. 科学方法(标准化落地流程))
- 五、最终总结
文档说明
本文档汇总全部对话内容:从序列化本质定义→结构化/线性数据本质区分→JSON对象转换归属→科学性/科学思维/科学思想/科学方法四层拆解,用于个人技术归档留存。
一、序列化、反序列化底层本质定义
1. 核心本源
一句话本质:把内存中「运行态结构化对象」与二进制/文本线性字节流双向转换,解决内存数据无法落地磁盘、跨进程、跨网络传输的硬件底层限制。
- 对象生命周期约束:面向对象编程语言中,对象存储于进程堆内存,附带对象头、内存引用地址、运行时元数据,进程销毁/断电后内存数据直接丢失,无法持久存储与跨主机传输;
- 硬件底层约束:磁盘存储、TCP网络报文、IO通道底层仅识别一维连续二进制01比特流,硬件无嵌套、从属、引用等结构化寻址能力;
- 矛盾:内存结构化数据格式 ≠ 硬件可读写的线性数据格式,序列化即是两种数据模型的标准化翻译方案。
2. 序列化(Serialize):对象 → 线性数据
本质:对结构化对象做数据扁平化,剥离运行时内存地址、类运行元信息,仅提取对象实例字段状态,按照约定编码规则,拼接为连续一维线性数据(byte\[\] / 文本字符串)
使用场景:
- 对象数据落地本地磁盘文件持久化;
- RPC远程调用跨网络传输对象;
- 对象存入Redis等中间件缓存。
3. 反序列化(Deserialize):线性数据 → 内存对象
本质:按约定编码规则解析一维线性数据流,拆分字段标识与字段数值,在当前进程内存中新建实例对象,并完成字段赋值,复原具备层级、引用关系的结构化数据
使用场景:读取磁盘文件、接收网络报文、读取缓存数据后还原业务对象。
4. 主流序列化协议分类
| 序列化方案 | 输出格式 | 类型 | 特征 |
|---|---|---|---|
| JDK原生序列化 | byte\[\]二进制 | 二进制序列化 | 附带全类名、版本号、类型元数据,体积臃肿,仅限Java语言 |
| JSON序列化 | 字符串 | 文本序列化 | 明文可读,跨全语言,冗余符号多,占用空间偏大 |
| XML | 标签文本 | 文本序列化 | 标签冗余,可读性高,现在使用变少 |
| Protobuf | byte\[\]二进制 | 二进制序列化 | 预定义Schema,编码紧凑,体积小、高性能、跨语言 |
5. 安全延伸:反序列化漏洞成因
外部可控的二进制/文本数据流可被恶意篡改,攻击者构造特制恶意序列化数据,反序列化重建对象过程中触发恶意代码执行,即经典反序列化漏洞。
二、对象与JSON字符串互转过程详解
1. 定性结论
对象转为JSON字符串属于【文本类型序列化】;JSON字符串转回内存对象属于【文本反序列化】,整体完全隶属于序列化体系范畴,和JDK二进制序列化仅存储载体格式不同,底层数学逻辑、数据转换思想完全一致。
2. 转换过程拆解
- 内存结构化对象:代码定义的Class实例,字段从属、嵌套关系由类结构天然定义,依靠引用关系寻址;
- 序列化(对象→JSON字符串):遍历对象所有属性,依托JSON语法规范
{}、[]、:、,等分隔符号,把层级、嵌套等结构化信息额外编码写入连续字符流,最终生成一维线性JSON文本; - 反序列化(JSON字符串→对象):解析JSON语法符号,剥离分隔符、拆分键值,依靠解析出的结构信息在堆中重建具备嵌套关系的结构化实例。
3. JSON与二进制序列化核心差异
- 二进制序列化:机器可读、体积紧凑、无人类可读性;
- JSON文本序列化:人机均可阅读,依靠额外语法符号存储结构信息,数据冗余更高。
三、结构化数据 & 线性数据:本质区别
1. 核心定义
- 结构化数据 :逻辑为树/图多维拓扑结构,数据元素依靠从属、嵌套、引用等语义关系关联,依靠关联关系寻址,和物理存储位置无关;典型:JVM堆中实例对象、内存中解析后的JSON DOM树;
- 线性数据 :一维平铺连续序列,无天然层级关联,依靠字节偏移、下标位置寻址,原生不携带结构信息,结构需要额外编码嵌入数据流;典型:byte\[\]字节数组、JSON字符串、磁盘文件、TCP数据包。
分水岭:结构化靠【关系】找数据,线性靠【位置】找数据。
2. 四大维度对比
- 逻辑组织
结构化:多维拓扑(嵌套/父子/引用),从属关系由类型定义天然自带;
线性:一维顺序链条,元素前后仅存在位置关系,无天然层级。 - 寻址方式
结构化:引用链/符号寻址(user.getAddr().city);
线性:偏移下标寻址,字符/字节位置变化即数据含义错乱。 - 物理存储
结构化:内存离散分配,多段内存块依靠指针串联;
线性:内存/磁盘连续整块缓冲区。 - 结构信息存储
结构化:结构内嵌在类型定义中,数据与结构一体化;
线性:原生无结构,结构信息靠分隔符、tag、元数据等编码写入数据流。
3. 硬件底层根源
计算机CPU、网卡、磁盘IO硬件物理层面仅支持按顺序串行读写比特,只兼容一维线性数据;结构化是面向编程语言、人类的逻辑抽象模型,序列化就是两种模型的转换器。
四、从科学性、科学思维、科学思想、科学方法四层系统化梳理
1. 科学性(客观底层规律)
序列化与反序列化是计算机体系客观规律产物,不是人为凭空设计的技术:
- 客观矛盾:内存结构化数据模型 ≠ 硬件IO线性数据模型;
- 客观必然:想要完成跨内存/磁盘/网络/进程的数据流转,必须建立一套双向无损映射转换规则,序列化即是这套映射规则的落地实现。
2. 科学思维(四大核心思维)
- 抽象思维:忽略对象方法、运行时地址、元数据,仅抽象提取对象状态(字段键值);
- 线性化思维:将多维树/图结构拍平为一维线性序列;
- 可逆映射思维 :序列化-反序列化满足双向可逆,
原对象→线性数据→复原新对象,实例数据与结构保持一致; - 边界跨越思维:打通内存↔磁盘、进程内↔进程外、本机↔跨主机的数据边界。
3. 科学思想(三大计算机基础思想)
- 数据持久化思想:内存易失特性,需要将瞬时运行态的数据状态固化落地;
- 通信标准化思想:异构语言、异构设备之间约定统一数据格式,实现跨端互通;
- 状态最小表示思想:任意复杂对象,均可剥离行为,用最小数据集描述实例状态。
4. 科学方法(标准化落地流程)
一套可复现、标准化的工程方法:
- 提取:剥离无关信息,只保留对象实例字段状态;
- 规约:定义序列化编码协议(JSON/Protobuf等格式规范);
- 编码(序列化):结构化→线性数据;
- 流转:存储至磁盘/经由网络传输;
- 解码(反序列化):线性数据还原为内存结构化对象。
五、最终总结
- 序列化本质:多维结构化数据 → 一维线性编码数据;
- 反序列化本质:一维线性编码数据 → 多维结构化数据;
- JSON互转本质:使用文本编码规则实现的序列化落地方案。