Python 序列化将对象转换为可存储/传输格式,反序列化还原为原始对象。
序列化工具对比
| 工具 | 特点 | 适用场景 |
|---|
| pickle | 支持所有 Python 对象 | Python 内部持久化 |
| json | 跨语言、仅基础类型 | Web API、配置文件 |
| yaml | 可读性强 | 配置文件 |
| msgpack | 高效二进制 | 高性能传输 |
pickle 模块
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| import pickle
# 序列化
data = {"name": "Alice", "age": 30}
serialized = pickle.dumps(data) # → bytes
# 反序列化
obj = pickle.loads(serialized)
# 文件操作
with open("data.pkl", "wb") as f:
pickle.dump(data, f)
with open("data.pkl", "rb") as f:
loaded = pickle.load(f)
|
警告:pickle 反序列化可能执行恶意代码,切勿加载不受信任的数据。
json 模块
1
2
3
4
5
6
7
8
9
10
| import json
# 序列化
data = {"name": "Bob", "scores": [90, 85]}
json_str = json.dumps(data)
json.dump(data, open("data.json", "w"))
# 反序列化
obj = json.loads(json_str)
obj = json.load(open("data.json", "r"))
|
自定义对象序列化
1
2
3
4
5
6
7
8
9
10
11
12
| class User:
def __init__(self, name, age):
self.name = name
self.age = age
def encode_user(obj):
if isinstance(obj, User):
return {"name": obj.name, "age": obj.age}
raise TypeError("Object not serializable")
user = User("Charlie", 25)
json_str = json.dumps(user, default=encode_user)
|
Pydantic + JSON
1
2
3
4
5
6
7
8
9
| from pydantic import BaseModel
class Item(BaseModel):
name: str
price: float
item = Item(name="Book", price=9.99)
json_str = item.model_dump_json() # V2 语法
new_item = Item.model_validate_json(json_str)
|
最佳实践
- 安全性:外部数据用 json/yaml.safe_load,不用 pickle
- 自定义对象:pickle 自动处理,json 需手动转换
- 性能:二进制格式(pickle、msgpack)比文本格式快
Comments