Python 对象序列化和反序列化:第 2 部分
什么是对象序列化与反序列化
在 Python 中,我们经常需要将一些对象或数据从内存中保存到硬盘或从网络传输,这时候就需要使用序列化和反序列化。序列化是将 Python 对象转换为字节流的过程,而反序列化则是将字节流转换为 Python 对象的过程。
Python 提供的序列化工具
Python 提供了许多序列化工具,包括 pickle、json、msgpack 等。其中,pickle 是 Python 自带的序列化和反序列化库,它没有任何依赖,可以将 Python 对象序列化为二进制格式或文本格式,同时也可以反序列化。json 和 msgpack 序列化工具是通过 JSON 和 MessagePack 格式来序列化和反序列化 Python 对象的,它们比 pickle 更加轻量级,通常用于网络传输和数据存储。
Python 对象序列化的原理
Python 对象序列化的原理主要基于 pickle 和 json 这两种序列化工具。pickle 序列化的过程是将 Python 对象转换为字节流,而反序列化则是将字节流转换为 Python 对象。pickle 使用 Python 的标准库模块 marshal 来生成二进制数据格式,并使用 pickle 协议来存储数据。pickle 协议是一种用于序列化和反序列化 Python 对象的二进制协议,可用于不同版本的 Python 解释器之间的数据传输。
Python 对象反序列化的原理
Python 对象反序列化的原理与序列化类似,主要基于 pickle 和 json 序列化工具。反序列化的过程是将字节流转换为 Python 对象,并将其重新加载到内存中。pickle 和 json 序列化工具都支持反序列化操作,pickle 反序列化时会使用 marshal 模块解析二进制数据格式,json 反序列化时会使用内置的 json 模块将 JSON 字符串转换为 Python 对象。
pickle 序列化和反序列化示例
import pickle
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
person = Person('John', 30)
# 序列化
data = pickle.dumps(person)
print(data)
# 反序列化
person2 = pickle.loads(data)
print(person2.name)
print(person2.age)
dumps() 方法将 Python 对象序列化为二进制数据格式,而 loads() 方法则将二进制数据格式反序列化为 Python 对象。
json 序列化和反序列化示例
import json
person = {'name': 'John', 'age': 30}
# 序列化
data = json.dumps(person)
print(data)
# 反序列化
person2 = json.loads(data)
print(person2['name'])
print(person2['age'])
dumps() 方法将 Python 对象序列化为 JSON 字符串,而 loads() 方法则将 JSON 字符串反序列化为 Python 对象。
Python 对象序列化的注意事项
在 Python 中,一些对象是不能被序列化的,比如文件对象、socket 对象等与 IO 或网络相关的对象,如果对这些对象进行序列化,会抛出 pickle.PicklingError 异常。此外,在使用 pickle 进行序列化时,也会存在一些安全隐患,因为 pickle 可以执行任意代码,如果接收到恶意数据,会导致安全问题。
总结
Python 对象序列化和反序列化是实现数据持久化和网络传输的关键技术之一,它可以将 Python 对象转换为可存储和传输的格式,并在需要的时候重新加载到内存中。Python 提供了 pickle、json 等序列化工具,可以满足不同场景下的序列化需求。但是,在使用时需要注意一些安全隐患和序列化对象的可序列化性。