张芷铭的个人博客

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)

最佳实践

  1. 安全性:外部数据用 json/yaml.safe_load,不用 pickle
  2. 自定义对象:pickle 自动处理,json 需手动转换
  3. 性能:二进制格式(pickle、msgpack)比文本格式快

Comments