python 序列化详解与实战

在 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

alden_ygq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值