Tailwind CSSTailwind CSS
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain

7.4 数据序列化与反序列化

数据序列化是将数据结构或对象转换为可存储或传输的格式的过程,而反序列化则是将序列化后的数据重新转换为原始数据结构或对象的过程。Python 提供了多种方式来实现数据的序列化与反序列化,常用的方法包括使用 json、pickle 和 yaml 等模块。

7.4.1 JSON 序列化与反序列化

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛用于 Web 开发和数据传输。Python 的 json 模块提供了对 JSON 数据的支持。

序列化(将 Python 对象转换为 JSON 字符串):

import json

data = {
    "name": "Alice",
    "age": 30,
    "is_student": False,
    "courses": ["Math", "Science"]
}

json_str = json.dumps(data)
print(json_str)

反序列化(将 JSON 字符串转换为 Python 对象):

json_str = '{"name": "Alice", "age": 30, "is_student": false, "courses": ["Math", "Science"]}'
data = json.loads(json_str)
print(data)

文件中的 JSON 序列化与反序列化:

# 序列化到文件
with open('data.json', 'w') as f:
    json.dump(data, f)

# 从文件反序列化
with open('data.json', 'r') as f:
    data = json.load(f)
    print(data)

7.4.2 Pickle 序列化与反序列化

pickle 是 Python 特有的序列化模块,它可以将几乎所有的 Python 对象转换为字节流,并且可以将其反序列化为原始对象。pickle 的序列化格式是 Python 特有的,因此不适合跨语言使用。

序列化(将 Python 对象转换为字节流):

import pickle

data = {
    "name": "Bob",
    "age": 25,
    "is_student": True,
    "courses": ["History", "Art"]
}

byte_stream = pickle.dumps(data)
print(byte_stream)

反序列化(将字节流转换为 Python 对象):

data = pickle.loads(byte_stream)
print(data)

文件中的 Pickle 序列化与反序列化:

# 序列化到文件
with open('data.pkl', 'wb') as f:
    pickle.dump(data, f)

# 从文件反序列化
with open('data.pkl', 'rb') as f:
    data = pickle.load(f)
    print(data)

7.4.3 YAML 序列化与反序列化

YAML(YAML Ain't Markup Language)是一种人类可读的数据序列化格式,常用于配置文件和数据交换。Python 的 yaml 模块提供了对 YAML 数据的支持。

安装 pyyaml 模块:

pip install pyyaml

序列化(将 Python 对象转换为 YAML 字符串):

import yaml

data = {
    "name": "Charlie",
    "age": 28,
    "is_student": False,
    "courses": ["Physics", "Chemistry"]
}

yaml_str = yaml.dump(data)
print(yaml_str)

反序列化(将 YAML 字符串转换为 Python 对象):

yaml_str = '''
name: Charlie
age: 28
is_student: false
courses:
  - Physics
  - Chemistry
'''

data = yaml.safe_load(yaml_str)
print(data)

文件中的 YAML 序列化与反序列化:

# 序列化到文件
with open('data.yaml', 'w') as f:
    yaml.dump(data, f)

# 从文件反序列化
with open('data.yaml', 'r') as f:
    data = yaml.safe_load(f)
    print(data)

7.4.4 序列化与反序列化的选择

  • JSON:适合跨语言的数据交换,支持基本数据类型和简单的数据结构。
  • Pickle:适合 Python 内部使用,支持几乎所有 Python 对象,但不安全且不适合跨语言使用。
  • YAML:适合人类可读的配置文件,支持复杂的数据结构,但性能不如 JSON 和 Pickle。

7.4.5 安全性考虑

  • JSON:相对安全,但需要注意反序列化时的数据类型。
  • Pickle:不安全,反序列化时可能执行任意代码,应避免反序列化不受信任的数据。
  • YAML:使用 yaml.safe_load 可以避免反序列化时的安全问题。

通过合理选择序列化与反序列化的方法,可以有效地处理数据的存储与传输需求。

Last Updated:: 3/17/25, 7:20 PM