使用 Python 实现序列化

序列化是将对象转换为可存储或传输的格式的过程。在 Python 中,序列化可以使用内置的 pickle 模块或第三方模块进行。

Python 在标准库中附带了以下模块,它们为不同目的提供了二进制数据序列化格式:

  • pickle:Python对象序列化
  • marshal:内部对象序列化
  • shelve:Python对象持久化
  • dbm:Unix 数据库的接口

主要使用pickle,其余三个要么是解释器内部使用的低级格式,要么是为了兼容性而保留的旧格式。

pickle 模块
pickle 模块提供了一种简单的序列化方法,将对象转换为二进制格式。要使用 pickle 模块进行序列化,您可以使用 pickle.dump() 函数将对象写入文件或流。

以下是使用 pickle 模块进行序列化的示例:

import pickle

class MyObject:
    def __init__(self, name, age):
        self.name = name
        self.age = age

obj = MyObject("John Doe", 30)

with open(
"obj.pkl", "wb") as f:
    pickle.dump(obj, f)

这将创建一个名为 obj.pkl 的文件,其中包含 MyObject 对象的序列化表示形式。

要反序列化对象,您可以使用 pickle.load() 函数。

with open("obj.pkl", "rb") as f:
    obj = pickle.load(f)

print(obj.name)
# John Doe
print(obj.age)
# 30

第三方模块
pickle 模块是一种简单的序列化方法,但它不支持所有对象类型。如果您需要序列化复杂对象,您可以使用第三方模块。
有许多第三方模块可用于序列化对象,包括:

  • json: 将对象转换为 JSON 格式。
  • yaml: 将对象转换为 YAML 格式。
  • msgpack: 将对象转换为高效的二进制格式。
  • dill,它可以扩展其功能,同时保持与pickle. 它可以处理更复杂的数据类型,包括lambda 表达式和 Python 模块。

下面是使用json库:

import json

# Sample data
data = {'name': 'John', 'age': 30, 'city': 'New York'}

# Serialize to a JSON format (as a string)
json_string = json.dumps(data)

# Save to a file
with open('serialized_data.json', 'w') as file:
    file.write(json_string)

# Deserialize from the JSON format (from a string)
with open('serialized_data.json', 'r') as file:
    loaded_data = json.loads(file.read())

print(loaded_data)

在上面的示例中,pickle用于二进制序列化,而json用于人类可读的序列化。根据您的要求选择合适的模块。

注意:使用时pickle,从不受信任的来源加载数据时要小心,因为它可以执行任意代码并带来安全风险。如果您需要与不受信任的来源共享数据,请考虑使用json或其他更安全的序列化格式。


另外,在处理文件时请考虑使用with语句,以确保使用后正确处理(关闭)文件。

选择合适的序列化方法
在选择序列化方法时,您需要考虑以下因素:

  • 对象类型: 您需要序列化什么类型的对象?
  • 性能: 您需要多快地序列化对象?
  • 兼容性: 您需要序列化对象与哪些其他系统兼容?