什么是编程中的 Serialization 和 Deserialization?
Source: Dev.to
如果你正在学习编程,你可能已经见过以下短语:
- “Serialize this object”
- “Deserialize the JSON”
- “Convert object to string”
……这可能会让人感到困惑。
为什么我们需要转换对象?
为什么不能直接使用它们?
别担心——阅读完本文后,你将以最简单的方式理解序列化和反序列化。
1️⃣ 困惑(为何这感觉很难)
你在程序中创建了一个对象。一切运行得很完美。
然后有人说:
- “把这些数据发送到前端。”
- “把这个对象保存到文件中。”
- “把它存入数据库。”
- “把它发送到另一台服务器。”
于是你突然被告知:“先把它序列化。”
现在你感到害怕。那到底是什么意思?
2️⃣ 为什么会有序列化(真正的问题)
在你的程序中,数据存在于 内存(RAM) 中。
原始内存的问题
- 程序停止时,内存会消失。
- 你无法将原始内存发送到另一台计算机。
- 你不能直接将内存结构存储到文件中。
- 其他编程语言无法理解你的内部对象格式。
计算机只能理解:
- 文本
- 原始字节(0 和 1)
因此,开发者需要一种方法来 将对象转换为可以保存或发送的形式。
这种解决方案称为 序列化。
当我们把它转换回去时,称为 反序列化。
3️⃣ 现实生活类比(超级简单)
想象你组装了一辆 LEGO 车。在你的房间里它已经完整组装好。
现在你想把它寄给住在另一个城市的表兄弟。你不能把完整的车直接寄过去,于是你:
- 把它拆成零件。
- 把零件装进盒子里。
- 寄出盒子。
你的表兄弟收到盒子,打开后重新组装 LEGO 车。
- 拆分和打包 → 序列化
- 重新组装 → 反序列化
就是这么简单。没有任何魔法。
4️⃣ 简单解释(无复杂词汇)
- Serialization = 将对象转换为文本或字节,以便保存或发送。
- Deserialization = 将该文本或字节转换回原始对象。
简而言之:
Object → Text/Bytes → Object
5️⃣ 序列化是如何工作的(逐步说明)
让我们想象在 Python 中有以下学生数据:
student = {
"name": "Rahul",
"age": 15
}
🔹 步骤 1:序列化
将其转换为 JSON(文本格式):
{"name": "Rahul", "age": 15}
现在它只是文本。该文本可以:
- 保存到文件中
- 存储在数据库里
- 通过 API 发送
- 在不同的编程语言之间共享
🔹 步骤 2:反序列化
当有人收到这段文本时,他们会把它转换回对象:
student = {"name": "Rahul", "age": 15}
现在它再次表现得像一个普通对象。
6️⃣ Very Small Code Example (Python)
序列化示例
import json # Library to work with JSON
student = {
"name": "Rahul",
"age": 15
}
# Convert dictionary to JSON string
serialized_data = json.dumps(student)
print(serialized_data)
输出
{"name": "Rahul", "age": 15}
反序列化示例
# Convert JSON string back to dictionary
original_data = json.loads(serialized_data)
print(original_data["name"])
输出
Rahul
Source: …
7️⃣ 干运行(最重要的部分)
让我们慢慢地走过这个过程。
-
创建对象
student = {"name": "Rahul", "age": 15}这是一段存储在内存中的字典。
-
序列化
serialized_data = json.dumps(student)结果:
serialized_data = '{"name": "Rahul", "age": 15}'重要提示:
serialized_data现在是一个 字符串,而不是字典。
尝试执行serialized_data["name"]会导致错误,因为它只是文本。 -
反序列化
original_data = json.loads(serialized_data)现在
original_data又是字典了,所以original_data["name"]可以工作。
完整过程
Object → JSON String → Object
8️⃣ 在真实世界中序列化的使用场景
序列化无处不在:
- 🌐 前端向后端发送数据
- 📱 移动应用调用服务器
- 💾 将数据保存到文件中
- 🗄️ 在数据库中存储对象
- 🔐 在微服务之间发送数据
- 🎮 保存游戏进度
- 📨 在网络上进行数据传输
每次使用 API 时,序列化都会在幕后悄悄进行。当 Instagram 加载你的个人资料时……序列化和反序列化正默默工作。
9️⃣ 常见初学者错误
- ❌ 认为 JSON 与对象相同 – JSON 是文本;对象存在于内存中。
- ❌ 忘记序列化会把对象转换为字符串 – 你不能直接在字符串上访问属性。
- ❌ 在未反序列化的情况下尝试像字典一样访问 JSON。
- ❌ 假设序列化仅指 JSON – 它也可以是 XML、二进制格式、Protocol Buffers 等。
🔟 序列化 vs 反序列化(快速比较)
| 序列化 | 反序列化 | |
|---|---|---|
| 方向 | 对象 → 文本/字节 | 文本/字节 → 对象 |
| 发生时间 | 发送或保存之前 | 接收或读取之后 |
| 发生地点 | 发送方 | 接收方 |
1️⃣1️⃣ 何时应该使用序列化?
- 每当你需要 持久化数据(文件、数据库、缓存)时。
- 每当你需要在进程、服务或机器之间 通信 时。
- 当你想要在不同的编程语言或平台之间 共享数据 时。
简而言之,只要数据必须离开当前程序的内存,就需要序列化(以及另一端相应的反序列化)。
使用序列化的情况
- 您希望将数据发送到其他系统
- 您希望永久保存对象
- 您希望不同语言能够理解您的数据
- 您正在构建 API
- 您正在使用数据库
如果数据要移出您的程序,就涉及序列化。
1️⃣2️⃣ Quick Revision Summary
- Serialization = 对象 → 文本/字节
- Deserialization = 文本/字节 → 对象
- 用于 发送 或 保存 数据
- JSON 是最常见的格式
- 序列化后,数据会变成 字符串
- 必须在将其作为对象使用前进行反序列化
- 在 API、数据库、移动应用 和 服务器 中使用
现在,如果有人说:
“在发送之前先序列化这个对象。”
你不会惊慌。
你只会想:
“哦……我们把它装进盒子里了。”
就这么简单。