目录
一、什么是序列化(Serialization)?
举个直观的例子
二、什么是反序列化(Deserialization)?
三、为什么需要序列化?
四、常见的序列化格式对比
五、序列化底层是怎么做的?
序列化过程:
反序列化过程:
六、序列化/反序列化常见坑
七、实际工程中应该怎么做?
八、总结
在实际项目开发中,“序列化(Serialization)”和“反序列化(Deserialization)”几乎无处不在。
但很多刚入门的同学,对它们的理解还停留在“转成字符串、传来传去”这么简单的层面。
其实,序列化的作用、原理、选择不同序列化协议的考量、安全风险、性能优化,每一个点都值得深入探讨!
一、什么是序列化(Serialization)?
序列化是将对象的状态转换为可存储或可传输格式的过程。
对象在内存中一般以特定的数据结构(指针、引用、哈希表、链表等)存在,直接传输内存数据是不可靠的(不同机器架构不同、数据对齐不同、指针无意义等问题)。
所以我们需要将对象转换成连续的字节流(或标准格式的文本),使得:
-
可以写入磁盘文件
-
可以通过网络发送到远端
-
可以被其他进程或设备正确解析
简单来说,序列化是让数据“离开内存,去旅行”的必备装备。
举个直观的例子
C++中的一个对象:
struct User {
std::string name;
int age;
};
User u{"Alice", 24};
序列化后,可能得到这样一段JSON字符串:
{"name": "Alice", "age": 24}
或者变成一段二进制流,比如:
[0x05][Alice][0x18]
二、什么是反序列化(Deserialization)?
反序列化就是序列化的逆过程。
把收到的字节流或文本格式数据,还原成内存中的对象或数据结构,供程序继续操作。
比如:
-
从磁盘读取一段JSON数据
-
解析网络收到的一段Protobuf消息
-
把Redis里缓存的对象取出来恢复成原始对象
这些都是反序列化的应用。
三、为什么需要序列化?
我们来列一下常见场景:
| 应用场景 | 为什么需要序列化 |
|---|---|
| 网络通信 | TCP/UDP传输的数据必须是字节流,无法直接传对象 |
| 本地持久化 | 把程序状态保存到磁盘,下次能恢复 |
| 跨平台数据交换 | 不同系统、不同语言之间必须用标准格式 |
| 缓存系统 | Redis、Memcached存的是序列化后的对象 |
| 消息队列 | Kafka、RabbitMQ里的消息通常也是经过序列化的 |
| RPC调用 | gRPC、Thrift调用远端服务需要将请求和响应序列化 |
没有序列化,现代分布式系统、微服务体系几乎无法正常运作!
四、常见的序列化格式对比
不同场景适合不同的序列化格式,常见的几种包括:
| 格式 | 优点 | 缺点 | 典型应用 |
|---|---|---|---|
| JSON | 人类可读、跨平台、广泛支持 | 体积大、解析慢 | 前后端接口、配置文件 |
| XML | 结构复杂、可扩展性好 | 体积更大、解析更慢 | SOAP服务、老系统 |
| Protobuf | 体积小、速度快、强类型定义 | 不易读、需要提前定义proto文件 | gRPC、分布式系统内部通信 |
| MessagePack | 比JSON小、解析快 | 不如Protobuf精简 | 移动端、缓存系统 |
| FlatBuffers | 零拷贝、超高速访问 | 使用复杂、生成文件较大 | 游戏开发、大量实时数据场景 |
| Avro | 支持Schema进化(动态变化) | 较重 | 大数据(Hadoop生态) |
▶ 简单总结:
-
传给人看的用 JSON
-
高性能通信用 Protobuf
-
体积敏感场景用 MessagePack/FlatBuffers
-
大数据流用 Avro
五、序列化底层是怎么做的?
不同协议实现不一样,但总体过程类似:
序列化过程:
-
遍历对象的各个成员
-
把成员名和值按照某种规则编码
-
将编码结果组织成二进制流或文本格式
反序列化过程:
-
按照协议解析字节流或文本
-
提取字段信息
-
重新创建对象并赋值
比如 Protobuf 就是通过 proto 文件定义消息结构,在序列化时将字段编号、数据值压缩成紧凑的二进制格式。
六、序列化/反序列化常见坑
-
版本兼容问题
-
加字段、删字段时,旧版本客户端可能崩溃!
-
解决方案:设计支持“向前兼容”和“向后兼容”的协议(比如 Protobuf 就支持)
-
-
性能瓶颈
-
大对象频繁序列化/反序列化,CPU和内存开销大
-
解决方案:缓存序列化结果、优化协议选择
-
-
安全风险
-
反序列化时如果处理不当,可能被黑客注入恶意数据(反序列化漏洞)
-
解决方案:只信任可信源数据、限制反序列化对象类型
-
-
浮点数精度问题
- JSON等文本协议保存浮点数时可能丢失精度
-
指针、引用、共享对象问题
- C++等语言中的裸指针、智能指针需要特别小心处理
七、实际工程中应该怎么做?
▶ 选好序列化协议
-
轻量级API通信选JSON
-
高性能微服务内部通信选Protobuf
-
超高频、大量小数据可以考虑FlatBuffers
▶ 优化性能
-
尽量复用对象
-
预先分配好内存
-
批量处理而不是逐条处理
▶ 注意安全问题
-
不要反序列化不可信来源的数据
-
限制反序列化类的白名单
-
检查数据大小、结构合理性
八、总结
序列化和反序列化是现代系统数据流动的桥梁。
-
序列化让数据可以跨内存、跨进程、跨机器传递;
-
反序列化让数据回到可以操作的对象状态;
-
正确、合理、安全地使用它们,是开发可靠系统的基础技能。
学习资源
如果你是也准备转行学习网络安全(黑客)或者正在学习,这里开源一份360智榜样学习中心独家出品《网络攻防知识库》,希望能够帮助到你
知识库由360智榜样学习中心独家打造出品,旨在帮助网络安全从业者或兴趣爱好者零基础快速入门提升实战能力,熟练掌握基础攻防到深度对抗。
1、知识库价值
深度: 本知识库超越常规工具手册,深入剖析攻击技术的底层原理与高级防御策略,并对业内挑战巨大的APT攻击链分析、隐蔽信道建立等,提供了独到的技术视角和实战验证过的对抗方案。
广度: 面向企业安全建设的核心场景(渗透测试、红蓝对抗、威胁狩猎、应急响应、安全运营),本知识库覆盖了从攻击发起、路径突破、权限维持、横向移动到防御检测、响应处置、溯源反制的全生命周期关键节点,是应对复杂攻防挑战的实用指南。
实战性: 知识库内容源于真实攻防对抗和大型演练实践,通过详尽的攻击复现案例、防御配置实例、自动化脚本代码来传递核心思路与落地方法。
2、 部分核心内容展示
360智榜样学习中心独家《网络攻防知识库》采用由浅入深、攻防结合的讲述方式,既夯实基础技能,更深入高阶对抗技术。

360智榜样学习中心独家《网络攻防知识库》采用由浅入深、攻防结合的讲述方式,既夯实基础技能,更深入高阶对抗技术。
内容组织紧密结合攻防场景,辅以大量真实环境复现案例、自动化工具脚本及配置解析。通过策略讲解、原理剖析、实战演示相结合,是你学习过程中好帮手。
1、网络安全意识

2、Linux操作系统

3、WEB架构基础与HTTP协议

4、Web渗透测试

5、渗透测试案例分享

6、渗透测试实战技巧

7、攻防对战实战

8、CTF之MISC实战讲解

3、适合学习的人群
一、基础适配人群
- 零基础转型者:适合计算机零基础但愿意系统学习的人群,资料覆盖从网络协议、操作系统到渗透测试的完整知识链;
- 开发/运维人员:具备编程或运维基础者可通过资料快速掌握安全防护与漏洞修复技能,实现职业方向拓展或者转行就业;
- 应届毕业生:计算机相关专业学生可通过资料构建完整的网络安全知识体系,缩短企业用人适应期;
二、能力提升适配
1、技术爱好者:适合对攻防技术有强烈兴趣,希望掌握漏洞挖掘、渗透测试等实战技能的学习者;
2、安全从业者:帮助初级安全工程师系统化提升Web安全、逆向工程等专项能力;
3、合规需求者:包含等保规范、安全策略制定等内容,适合需要应对合规审计的企业人员;
因篇幅有限,仅展示部分资料,完整版的网络安全学习资料已经上传CSDN,朋友们如果需要可以在下方CSDN官方认证二维码免费领取【保证100%免费】


1万+

被折叠的 条评论
为什么被折叠?



