序列化(Serialization) 和 反序列化(Deserialization) 是数据处理中的两个关键概念,常用于数据存储、网络传输、跨语言数据交换等场景。
序列化 是将数据结构或对象转换为某种可以存储或传输的格式的过程。通常,序列化的目的是为了将对象保存到文件、数据库,或者通过网络传输。
常见的序列化格式:
示例:假设有一个 Python 对象:
import json
person = {
"name": "John",
"age": 30,
"hobbies": ["reading", "cycling"]
}
# 序列化成 JSON 字符串
json_string = json.dumps(person)
print(json_string)
输出:
{"name": "John", "age": 30, "hobbies": ["reading", "cycling"]}
在这个例子中,Python 字典对象 person
被转换成了一个 JSON 格式的字符串。这就是 序列化。
反序列化 是将存储或传输的序列化数据转换回原始数据结构或对象的过程。也就是说,反序列化是将 JSON、XML、YAML 等格式的数据重新转换回编程语言中的对象或数据结构。
示例:如果接收到上面 JSON 格式的数据并希望将其恢复为 Python 对象,可以使用 反序列化。
# 反序列化 JSON 字符串
json_string = '{"name": "John", "age": 30, "hobbies": ["reading", "cycling"]}'
person = json.loads(json_string)
print(person)
输出:
{'name': 'John', 'age': 30, 'hobbies': ['reading', 'cycling']}
在这个例子中,json.loads()
函数将 JSON 字符串转换回了一个 Python 字典对象。这就是 反序列化。
通过序列化和反序列化,我们可以方便地实现数据的持久化存储、网络传输、以及跨平台的数据交换。
YAML、XML、JSON 和 TOML 都是常用的数据序列化格式,每种格式都有自己的特点和适用场景。
全称:YAML Ain’t Markup Language
特点:
示例:
name: John Doe
age: 30
address:
street: 123 Main St
city: Somewhere
zip: 12345
hobbies:
- reading
- cycling
- painting
优点:
缺点:
全称:eXtensible Markup Language
特点:
示例:
<person>
<name>John Doename>
<age>30age>
<address>
<street>123 Main Ststreet>
<city>Somewherecity>
<zip>12345zip>
address>
<hobbies>
<hobby>readinghobby>
<hobby>cyclinghobby>
<hobby>paintinghobby>
hobbies>
person>
优点:
缺点:
全称:JavaScript Object Notation
特点:
{}
来表示对象,方括号 []
来表示数组,适合数据交换。示例:
{
"name": "John Doe",
"age": 30,
"address": {
"street": "123 Main St",
"city": "Somewhere",
"zip": 12345
},
"hobbies": ["reading", "cycling", "painting"]
}
优点:
缺点:
全称:Tom’s Obvious, Minimal Language
特点:
示例:
name = "John Doe"
age = 30
address = { street = "123 Main St", city = "Somewhere", zip = 12345 }
hobbies = ["reading", "cycling", "painting"]
优点:
缺点:
特性 | YAML | XML | JSON | TOML |
---|---|---|---|---|
可读性 | 高,适合人类编辑 | 较低,标签较多,不易阅读 | 高,简洁但不如 YAML 易读 | 高,简洁且结构清晰 |
语法结构 | 通过缩进表示层级,无需括号和引号 | 通过标签表示层级,冗长 | 使用括号表示层级,简洁 | 类似 INI 格式,通过 = 赋值 |
支持注释 | 支持注释(以 # 开头) |
支持注释(以 包裹) |
不支持注释 | 支持注释(以 # 开头) |
数据类型支持 | 支持复杂数据结构,日期,引用 | 支持自定义标签,属性,复杂结构 | 支持对象、数组、基本数据类型 | 支持表格、数组、日期、基本数据类型 |
扩展性 | 支持引用、锚点等高级功能 | 非常灵活,可以定义自定义标签和属性 | 无扩展性 | 适合配置文件,但功能不如 YAML 灵活 |
适用场景 | 配置文件、DevOps、容器编排、CI/CD | 企业级系统、Web 服务(如 SOAP) | Web 数据交换、API | 配置文件,特别是在 Rust 项目中使用 |