在 Python 中,序列化是指将对象(如列表、字典、自定义类实例等)转换为一种可以存储或传输的格式,常见的序列化格式有 JSON、pickle 等。反序列化则是将序列化后的数据恢复成原来的对象。下面详细介绍几种常见的序列化方式及其实战应用:
1. JSON 序列化与反序列化
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,在不同编程语言之间广泛使用,常用于 Web 应用的数据传输和存储。Python 内置了json
模块来处理 JSON 数据。
核心函数:
json.dumps()
:将 Python 对象转换为 JSON 格式的字符串(序列化)。json.loads()
:将 JSON 格式的字符串转换回 Python 对象(反序列化)。
示例代码:
import json
# 定义一个Python对象(字典)
data = {
"name": "Alice",
"age": 30,
"hobbies": ["reading", "swimming"]
}
# 序列化:将Python对象转换为JSON字符串
json_str = json.dumps(data)
print(json_str)
# 输出:{"name": "Alice", "age": 30, "hobbies": ["reading", "swimming"]}
# 反序列化:将JSON字符串转换回Python对象
new_data = json.loads(json_str)
print(new_data)
# 输出:{'name': 'Alice', 'age': 30, 'hobbies': ['reading','swimming']}
print(new_data["name"])
# 输出:Alice
实战场景:
- Web API 数据交互:在开发 Web 应用时,后端的 Python 服务处理完数据后,将数据序列化为 JSON 格式返回给前端,前端接收到后进行反序列化处理。例如,使用 Flask 框架开发 API:
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/data')
def get_data():
data = {
"message": "Hello, World!",
"status": 200
}
# jsonify函数内部调用了json.dumps,将Python对象转换为JSON响应
return jsonify(data)
- 数据存储:将数据以 JSON 格式保存到文件中,方便后续读取。
import json
data = {
"users": [
{"name": "Bob", "age": 25},
{"name": "Charlie", "age": 35}
]
}
# 写入JSON数据到文件
with open('data.json', 'w') as file:
json.dump(data, file) # json.dump直接将对象写入文件,等价于json.dumps(data)后再写入
# 从文件中读取JSON数据
with open('data.json', 'r') as file:
new_data = json.load(file) # json.load直接从文件读取并反序列化,等价于读取文件内容后再json.loads
print(new_data)
2. Pickle 序列化与反序列化
Pickle 是 Python 特有的序列化模块,它可以将 Python 对象序列化为字节流,也能将字节流反序列化为原来的 Python 对象,支持几乎所有的 Python 对象,包括自定义类实例。但 Pickle 序列化后的数据只能在 Python 环境中使用,且存在安全风险(如果反序列化不可信的数据可能导致代码执行)。
核心函数:
pickle.dumps()
:将 Python 对象转换为字节流(序列化)。pickle.loads()
:将字节流转换回 Python 对象(反序列化)。
示例代码:
import pickle
# 定义一个自定义类
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
person = Person("David", 28)
# 序列化:将自定义类实例转换为字节流
pickled_data = pickle.dumps(person)
print(pickled_data)
# 输出:b'\x80\x04\x95\x1f\x00\x00\x00\x00\x00\x00\x00\x8c\x08__main__\x94\x8c\x06Person\x94\x93\x94)\x81\x94}q\x00(X\x04\x00\x00\x00nameq\x01X\x05\x00\x00\x00Davidq