Python 中的序列化

2024 年 8 月 29 日 | 阅读 3 分钟

序列化是将内存中的信息项转换为可保存或传输的布局,以便以后可以将其重新构造为原始对象。在 Python 中,序列化允许您将复杂的记录系统,包括列表、字典自定义对象,保存到文件或通过网络传输它们。

Python 提供了几种内置的序列化模块,包括pickle、JSONmarshal

  • Pickle:Python 的pickle 模块提供了一种强大且灵活的方式来序列化和反序列化对象。它可以处理几乎任何 Python 对象,并将其转换为字节流,该字节流可以保存到文件或通过网络传输。

示例代码

输出

[1, 2, 3, 4, 5]
  • JSON:json 模块提供了处理JSON 数据的功能,JSON 是一种轻量级的数据交换格式。它可以处理简单的信息类型,如字符串、数字、列表、字典以及这些类型的嵌套组合

示例代码

输出

{"Company": "JAVATPOINT", "Name": "AJIT", "Salary": 10000}
{'Company': 'JAVATPOINT', 'Name': 'AJIT', 'Salary': 10000}

请注意,虽然 Pickle 是 Python 特有的,但 JSON 是一种广泛支持的格式,可以在不同的编程语言中使用。

当需要在系统之间传输某些数据以保存或恢复复杂的数据结构时,序列化过程起着至关重要的作用,在这些场景下非常有用。从不可信或不可靠的源反序列化数据可能导致任意代码的运行,这可能对系统造成危险。因此,反序列化数据时应小心谨慎。确认序列化数据来自可靠的来源至关重要。

其他一些附加信息

1. Pickle

  • Pickle 是一个 Python 特有的序列化模块,可以处理几乎任何 Python 对象。
  • 它支持列表、字典、集合、类等的复杂数据结构的序列化。
  • Pickle 使用二进制格式存储数据,这使得它在空间方面更有效率,但不可读。
  • pickle 模块提供了两个主要函数:“pickle.dump(obj, file)”用于序列化对象并将其保存到文件,以及“pickle.load(file)”用于从文件中反序列化对象。
  • 需要注意的是,pickle 模块存在安全隐患。不可信或恶意构造的 pickle 文件可以执行任意代码,因此在从不可信来源反序列化数据时要格外小心。

2. JSON

  • 一种流行且轻量级的数据交换格式是JSON(JavaScript 对象表示法)
  • Python 的 json 模块提供了处理 JSON 数据的功能,简化了对象序列化和反序列化。
  • JSON 支持的**基本数据类型包括字符串、数字、布尔值、列表、字典以及这些类型的嵌套组合**。
  • JSON 格式的序列化数据易于人类阅读,并且也可以被其他编程语言轻松理解。
  • json 模块分别提供了“json.dumps(obj)”和“json.loads(json_str)”函数用于序列化和反序列化对象。

3. 其他包

  • 除了 pickle 和 json,Python 还提供了其他序列化库,如marshal、msgpack、yaml等。
  • 与 pickle 相比,marshal 模块提供了一种更紧凑的序列化格式,但它仅与 Python 兼容,既不可读,也无法与其他语言互操作。
  • 与 JSON 或 pickle 相比,msgpack 模块在提供序列化各种数据类型的同时,速度更快,空间效率更高。此外,它还可以与其他语言进行通信。
  • YAML(YAML Ain't Markup Language)模块以这种人类可读且简单的格式提供序列化。它经常用于配置文件。

4. 自定义序列化

  • Python 的__getstate__()__setstate__() 方法,或者 pickle 的__getnewargs__() 方法,允许您为对象构建自定义序列化和反序列化方法。
  • 通过在类中实现这些方法,您可以控制对象的序列化和反序列化。

因此,我们可以得出结论,Python 的序列化功能使得在计算机之间存储和传输复杂的数据结构变得容易。通过选择正确的序列化格式并考虑兼容性和安全性问题,您可以在 Python 程序中有效地使用序列化。