1. 为什么要掌握数据序列化技术
作为一名Python开发者,我经常遇到这样的场景:程序运行中产生的数据对象,在程序关闭后就消失了。比如一个用户配置字典、机器学习训练好的模型、爬虫采集的数据集等等。这些内存中的对象如果不能持久化保存,每次重启程序都要从头开始,效率实在太低。
这就是序列化技术的用武之地。简单来说,序列化(Serialization)就是把内存中的对象转换成可以存储或传输的格式(字节流或文本),反序列化(Deserialization)则是把这个过程反过来,把存储的格式重新还原成内存对象。
举个生活中的例子:序列化就像把新鲜水果做成罐头,反序列化就是打开罐头恢复成可食用的状态。罐头可以长期保存、方便运输,但需要特殊的封装和解封过程。
在Python中,我们主要有三种序列化方案:
- pickle - Python原生的"私人罐头",支持几乎所有Python对象
- JSON - 通用的"标准罐头",适合跨语言交换
- msgpack - 高效的"压缩罐头",兼顾性能和跨语言
接下来我会详细介绍这三种方案的具体使用方法和适用场景。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Python原生方案:pickle模块
2.1 pickle基础用法
pickle是Python标准库自带的序列化模块,它的最大特点就是"无所不包"——几乎所有的Python内置类型和自定义类实例都可以被pickle序列化。
python复制import pickle
# 准备一个复杂的数据对象
data = {
'name': '张三',
'age': 28,
'skills': ['Python', '数据分析', '机器学习'],
'married': False,
'salary': None
}
# 序列化为字节串
byte_data = pickle.dumps(data)
print(f"序列化后的字节串长度:{len(byte_data)}字节")
# 反序列化回原对象
new_data = pickle.loads(byte_data)
print(new_data) # 与原对象完全一致
注意:pickle默认生成的是字节串(bytes),不是字符串(str)。这是因为序列化后的数据本质上是二进制格式。
2.2 文件读写操作
更常见的用法是直接把对象序列化到文件中:
python复制# 写入文件
with open('user_data.pkl', 'wb') as f: # 必须用二进制模式'wb'
pickle.dump(data, f)
# 从文件读取
with open('user_data.pkl', 'rb') as f: # 必须用二进制模式'rb'
loaded_data = pickle.load(f)
这里有几个关键点需要注意:
- 文件必须用二进制模式('wb'/'rb')打开
- 写入和读取的顺序要对应
- 文件扩展名通常用.pkl或.pickle
2.3 自定义类的序列化
pickle的强大之处在于它能自动处理自定义类的实例:
python复制class Employee:
def __init__(self, name, department):
self.name = name
self.department = department
def introduce(self):
print(f"我是{self.department}的{self.name}")
# 创建实例并序列化
emp = Employee('李四', '研发部')
emp_byte = pickle.dumps(emp)
# 反序列化后仍保留类方法和属性
emp2 = pickle.loads(emp_byte)
emp2.introduce() # 输出:我是研
