11

使用 Python 实现序列化

 8 months ago
source link: https://www.jdon.com/71114.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

使用 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语句,以确保使用后正确处理(关闭)文件。

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

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

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK