首页后端开发PythonPython序列化-pickle

Python序列化-pickle

时间2023-04-25 03:00:01发布访客分类Python浏览414
导读:Python 中的 pickle 模块提供了一种方便的方式来序列化和反序列化 Python 对象。pickle 可以将 Python 对象转换为字节流,然后将其存储在文件或内存中。pickle 可以将 Python 对象还原为其原始状态。序...

Python 中的 pickle 模块提供了一种方便的方式来序列化和反序列化 Python 对象。pickle 可以将 Python 对象转换为字节流,然后将其存储在文件或内存中。pickle 可以将 Python 对象还原为其原始状态。

序列化

要序列化 Python 对象,我们可以使用 pickle.dump() 函数将其保存到文件中,或者使用 pickle.dumps() 函数将其序列化为字节流。

import pickle

# 序列化 Python 对象并将其保存到文件中
data = {
'name': 'Alice', 'age': 30}

with open('data.pickle', 'wb') as f:
    pickle.dump(data, f)

# 序列化 Python 对象并将其转换为字节流
data = {
'name': 'Bob', 'age': 25}

bytes_data = pickle.dumps(data)

在上面的示例中,我们使用 pickle.dump() 函数将 Python 对象 data 保存到文件 'data.pickle' 中。我们使用 wb 模式打开文件,因为 pickle 序列化的数据是二进制的。我们还使用 pickle.dumps() 函数将 Python 对象 data 序列化为字节流。

反序列化

要从 pickle 格式的文件或字节流中反序列化 Python 对象,我们可以使用 pickle.load() 函数或 pickle.loads() 函数。

import pickle

# 从 pickle 格式的文件中反序列化 Python 对象
with open('data.pickle', 'rb') as f:
    data = pickle.load(f)
    print(data)

# 从 pickle 格式的字节流中反序列化 Python 对象
bytes_data = b'\x80\x04\x95\x15\x00\x00\x00\x00\x00\x00\x00}
\x94(\x8c\x04name\x94\x8c\x05Alice\x94\x8c\x03age\x94K\x1e\x86\x94.'
data = pickle.loads(bytes_data)
print(data)

在上面的示例中,我们使用 pickle.load() 函数从 pickle 格式的文件 'data.pickle' 中反序列化 Python 对象。我们使用 rb 模式打开文件,因为 pickle 反序列化的数据是二进制的。我们还使用 pickle.loads() 函数从 pickle 格式的字节流中反序列化 Python 对象。

自定义序列化器

pickle 模块还提供了一种机制来自定义 Python 对象的序列化和反序列化过程。我们可以定义一个类并实现 getstate() 和 setstate() 方法来控制对象的序列化和反序列化过程。

import pickle

# 自定义类
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    # 定义 __getstate__() 方法,用于将 Person 类的属性转换为 pickle 格式的字典
    def __getstate__(self):
        return {

            'name': self.name,
            'age': self.age
        }
    

    # 定义 __setstate__() 方法,用于将 pickle 格式的字典转换为 Person 类的属性
    def __setstate__(self, state):
        self.name = state['name']
        self.age = state['age']

# 序列化自定义类
person = Person('Alice', 30)
bytes_data = pickle.dumps(person)

# 反序列化自定义类
person = pickle.loads(bytes_data)
print(person.name, person.age)

在上面的示例中,我们定义了一个名为 Person 的自定义类,并实现了 getstate() 和 setstate() 方法来自定义对象的序列化和反序列化过程。在 getstate() 方法中,我们将 Person 类的属性转换为一个字典,并将其返回。在 setstate() 方法中,我们将 pickle 格式的字典转换为 Person 类的属性。

接下来,我们创建了一个名为 person 的 Person 类对象,并使用 pickle.dumps() 函数将其序列化为字节流。然后,我们使用 pickle.loads() 函数将字节流反序列化为 Person 类对象,并打印出其属性。

序列化安全性

需要注意的是,pickle 模块的序列化和反序列化过程可能存在安全风险。由于 pickle 可以将任何 Python 对象序列化为字节流,因此不受信任的输入可能会导致代码注入和远程执行等攻击。因此,在从不受信任的源接收数据时,应谨慎使用 pickle。为了确保序列化的安全性,可以使用 json 格式或其他受限制的序列化格式。

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!

python

若转载请注明出处: Python序列化-pickle
本文地址: https://pptw.com/jishu/7891.html
Python面向对象编程-类和对象-类的定义和使用(二) python自定义 JSON 序列化

游客 回复需填写必要信息