Data Serialization(数据序列化)

文章目录

    • [Data Serialization](#Data Serialization)
      • [1. 序列化(Serialization)](#1. 序列化(Serialization))
      • [2. 反序列化(Deserialization)](#2. 反序列化(Deserialization))
      • [3. Application](#3. Application)
      • [4. Conclusion](#4. Conclusion)
    • [Data Serialization Format](#Data Serialization Format)
      • [1. YAML](#1. YAML)
      • [2. XML](#2. XML)
      • [3. JSON](#3. JSON)
      • [4. TOML](#4. TOML)
      • [5. 对比总结](#5. 对比总结)
      • [6. 选择推荐](#6. 选择推荐)

Data Serialization

序列化(Serialization)反序列化(Deserialization) 是数据处理中的两个关键概念,常用于数据存储、网络传输、跨语言数据交换等场景。

1. 序列化(Serialization)

序列化 是将数据结构或对象转换为某种可以存储或传输的格式的过程。通常,序列化的目的是为了将对象保存到文件、数据库,或者通过网络传输。

常见的序列化格式

  • JSON:广泛用于 Web 服务和 API 的数据交换。
  • XML:用于数据交换,特别是在企业级应用中(如 SOAP 协议)。
  • YAML:用于配置文件和数据交换,特别适合人类可读。
  • 二进制格式:用于高效存储和传输,比如 Protocol Buffers 和 Avro。

示例:假设有一个 Python 对象:

python 复制代码
import json

person = {
    "name": "John",
    "age": 30,
    "hobbies": ["reading", "cycling"]
}

# 序列化成 JSON 字符串
json_string = json.dumps(person)
print(json_string)

输出

json 复制代码
{"name": "John", "age": 30, "hobbies": ["reading", "cycling"]}

在这个例子中,Python 字典对象 person 被转换成了一个 JSON 格式的字符串。这就是 序列化

2. 反序列化(Deserialization)

反序列化 是将存储或传输的序列化数据转换回原始数据结构或对象的过程。也就是说,反序列化是将 JSON、XML、YAML 等格式的数据重新转换回编程语言中的对象或数据结构。

示例 :如果接收到上面 JSON 格式的数据并希望将其恢复为 Python 对象,可以使用 反序列化

python 复制代码
# 反序列化 JSON 字符串
json_string = '{"name": "John", "age": 30, "hobbies": ["reading", "cycling"]}'
person = json.loads(json_string)
print(person)

输出

python 复制代码
{'name': 'John', 'age': 30, 'hobbies': ['reading', 'cycling']}

在这个例子中,json.loads() 函数将 JSON 字符串转换回了一个 Python 字典对象。这就是 反序列化

3. Application

  • 存储:将对象序列化后存储到文件或数据库中,方便之后恢复。
  • 网络传输:通过网络将序列化后的数据发送给另一个系统,接收方再反序列化为原始数据格式。
  • 跨平台通信:不同系统(例如,Python 和 Java)之间可以通过 JSON、XML 等格式进行数据交换,通过序列化和反序列化来保证数据一致性。
  • 对象缓存:在内存中缓存对象时,可以将对象序列化存储在文件系统或数据库中,之后可以通过反序列化恢复对象。

4. Conclusion

  • 序列化:将对象转换为可以存储或传输的格式(如 JSON、XML、二进制等)。
  • 反序列化:将存储或传输的格式数据恢复为对象或数据结构。

通过序列化和反序列化,我们可以方便地实现数据的持久化存储、网络传输、以及跨平台的数据交换。

Data Serialization Format

YAML、XML、JSON 和 TOML 都是常用的数据序列化格式,每种格式都有自己的特点和适用场景。

1. YAML

全称 :YAML Ain't Markup Language
特点

  • 简洁、易读:使用缩进来表示层次结构,不需要大量的符号,便于人类阅读和编辑。
  • 支持复杂结构:支持数组、字典、引用、日期等。
  • 适用场景:配置文件、CI/CD 配置(如 GitHub Actions)、容器编排(如 Docker Compose、Kubernetes)等。

示例

yaml 复制代码
name: John Doe
age: 30
address:
  street: 123 Main St
  city: Somewhere
  zip: 12345
hobbies:
  - reading
  - cycling
  - painting

优点

  • 高度可读。
  • 支持多行字符串、注释、复杂结构。

缺点

  • 解析较 JSON 慢,特别是在大量数据时。
  • 格式要求严格,缩进不一致可能导致错误。

2. XML

全称 :eXtensible Markup Language
特点

  • 自定义标签:可以定义任意标签来描述数据结构。
  • 层次结构清晰:通过标签和属性构成层次化结构。
  • 适用场景:复杂的数据交换,特别是在企业级系统、Web 服务(SOAP)、文档处理等领域。

示例

xml 复制代码
<person>
  <name>John Doe</name>
  <age>30</age>
  <address>
    <street>123 Main St</street>
    <city>Somewhere</city>
    <zip>12345</zip>
  </address>
  <hobbies>
    <hobby>reading</hobby>
    <hobby>cycling</hobby>
    <hobby>painting</hobby>
  </hobbies>
</person>

优点

  • 灵活、可扩展,可以创建自定义标签和属性。
  • 支持验证(使用 DTD、XSD)和转换(XSLT)。

缺点

  • 格式冗长,包含大量的标签,使得文档较为臃肿。
  • 相比 JSON 和 YAML 更难以手工编辑。

3. JSON

全称 :JavaScript Object Notation
特点

  • 轻量级 :格式简洁,使用花括号 {} 来表示对象,方括号 [] 来表示数组,适合数据交换。
  • 易于解析:支持广泛的编程语言和库。
  • 适用场景:Web API、数据交换、服务器与客户端通信等。

示例

json 复制代码
{
  "name": "John Doe",
  "age": 30,
  "address": {
    "street": "123 Main St",
    "city": "Somewhere",
    "zip": 12345
  },
  "hobbies": ["reading", "cycling", "painting"]
}

优点

  • 格式简洁,易于机器和人类读取。
  • 广泛支持,尤其是在 Web 开发中非常流行。
  • 支持简单数据类型,如字符串、数字、布尔值等。

缺点

  • 不支持注释。
  • 格式相对严格,需要使用双引号。

4. TOML

全称 :Tom's Obvious, Minimal Language
特点

  • 简洁、可读:语法简洁,专注于配置文件,采用类似于 INI 的格式。
  • 数据类型支持:支持日期、数组、表格等结构,支持多行字符串。
  • 适用场景:配置文件,尤其在 Rust 等语言中较为流行。

示例

toml 复制代码
name = "John Doe"
age = 30
address = { street = "123 Main St", city = "Somewhere", zip = 12345 }
hobbies = ["reading", "cycling", "painting"]

优点

  • 简洁、清晰、适合手动编辑。
  • 比 INI 格式更强大,支持更多数据类型。
  • 易于与编程语言交互。

缺点

  • 相对不如 YAML 和 JSON 普及。
  • 支持的功能较少,主要用于配置文件。

5. 对比总结

特性 YAML XML JSON TOML
可读性 高,适合人类编辑 较低,标签较多,不易阅读 高,简洁但不如 YAML 易读 高,简洁且结构清晰
语法结构 通过缩进表示层级,无需括号和引号 通过标签表示层级,冗长 使用括号表示层级,简洁 类似 INI 格式,通过 = 赋值
支持注释 支持注释(以 # 开头) 支持注释(以 <!-- --> 包裹) 不支持注释 支持注释(以 # 开头)
数据类型支持 支持复杂数据结构,日期,引用 支持自定义标签,属性,复杂结构 支持对象、数组、基本数据类型 支持表格、数组、日期、基本数据类型
扩展性 支持引用、锚点等高级功能 非常灵活,可以定义自定义标签和属性 无扩展性 适合配置文件,但功能不如 YAML 灵活
适用场景 配置文件、DevOps、容器编排、CI/CD 企业级系统、Web 服务(如 SOAP) Web 数据交换、API 配置文件,特别是在 Rust 项目中使用

6. 选择推荐

  • YAML:用于配置文件、DevOps 工具(如 Kubernetes 配置、Docker Compose)和复杂数据结构的表示,适合需要易读的场景。
  • XML:适用于复杂的数据交换场景、企业级 Web 服务(如 SOAP),需要强类型和数据验证时使用。
  • JSON:用于 Web API 和数据交换,尤其在前后端通信、存储等场景中广泛使用。
  • TOML:轻量级配置文件格式,适合需要简洁、结构化配置的项目,特别是 Rust 项目中。
相关推荐
榆榆欸1 分钟前
5.实现 Channel 类,Reactor 模式初步形成
linux·网络·c++·tcp/ip
m0_741574752 分钟前
IP综合实验
网络
Dream Algorithm11 分钟前
SD-WAN组网方案
网络·信息与通信
安 当 加 密11 分钟前
如何在Windows服务器上搭建RADIUS认证服务器,有哪些开源方案和付费解决方案
服务器·windows·开源
obboda18 分钟前
VRRP虚拟路由器冗余协议
网络·智能路由器
2301_旺仔20 分钟前
VRRP交换机三层架构综合实验
网络·vrrp·交换机互为备份·stp生成树
qwer5558833 分钟前
linux--------------进程控制
linux·运维·服务器
时间会给答案scidag4 小时前
maven高级
java·服务器·前端
王伯爵6 小时前
5G核心网(5GC)中PCC(Policy and Charging Control,策略与计费控制)
服务器·网络·5g
ssr——ssss8 小时前
网络华为HCIA+HCIP 策略路由,双点双向
网络·华为