在程式设计中,**序列化(Serialization)和反序列化(Deserialization)**是两个常见的概念,主要与资料的转换和储存有关。简单来说,这两个过程是资料在不同形式之间转换的过程。

1. 序列化 (Serialization)

序列化是将资料结构或物件状态转换为可以储存或传输的格式,通常是二进制或字串格式。这个过程使得物件可以被储存在档案中、传输到网路上、或储存在资料库中,且能够在未来再进行反序列化(还原)以恢复成原来的物件。

简单的例子:假设你有一个 Python 字典 {"name": "Alice", "age": 30},你想将它写入文件中,或者将它发送到网路上,你需要将它「序列化」成某种格式(如 JSON 或 Pickle 格式)。在这种情况下,序列化就是将 Python 物件转换为字串或二进制格式,以便进行储存或传输。在 Python 中,常用的序列化格式包括:

  • JSON(JavaScript Object Notation):通常用于资料交换,尤其在 Web 开发中。
  • Pickle:Python 自有的序列化格式,适用于 Python 物件的储存和重建。

2. 反序列化 (Deserialization)

反序列化是序列化的反向过程,将储存或传输过来的资料恢复为原来的物件或资料结构。也就是说,将二进制或字串格式的资料转换回程式可以处理的物件。

简单的例子:假设你有一个序列化后的资料(例如 JSON 格式的字串)\'{"name": "Alice", "age": 30}\',你想将它转换回 Python 字典物件,这时候就需要进行反序列化。在 Python 中,常用的反序列化方式包括:

  • JSON 反序列化(json.loads())
  • Pickle 反序列化(pickle.load())
  • 序列化与反序列化的应用范例
  • JSON 格式的序列化与反序列化:

import json

# 物件
person = {"name": "Alice", "age": 30}

# 序列化: 将 Python 字典转换为 JSON 格式的字串
json_data = json.dumps(person)
print("Serialized data:", json_data)

# 反序列化: 将 JSON 格式的字串转换回 Python 字典
person_object = json.loads(json_data)
print("Deserialized data:", person_object)

在这个例子中:

  • json.dumps():将 Python 字典转换为 JSON 格式的字串,这就是序列化。
  • json.loads():将 JSON 格式的字串转换回 Python 字典,这就是反序列化。Pickle 格式的序列化与反序列化:

import pickle

# 物件
person = {"name": "Alice", "age": 30}

# 序列化: 将 Python 物件转换为二进制格式
with open("person.pkl", "wb") as file:
pickle.dump(person, file)

# 反序列化: 从档案中读取二进制格式并转换回 Python 物件
with open("person.pkl", "rb") as file:
loaded_person = pickle.load(file)
print("Deserialized data:", loaded_person)

在这个例子中:

  • pickle.dump():将 Python 物件转换为二进制格式并储存在档案中,这就是序列化。
  • pickle.load():将档案中的二进制资料反序列化回 Python 物件。

为什么要使用序列化和反序列化?

储存和传输资料:透过序列化,可以将复杂的资料结构(例如 Python 物件、字典、列表等)转换为便于储存或传输的格式。反序列化则可以将其转换回原本的格式,让程式能够继续处理这些资料。

Web API 与资料交换:网页应用程序、API、微服务等经常使用 JSON 来序列化和反序列化资料,以便于在不同的系统之间进行资料交换。

储存 Python 物件:在 Python 中,你可以使用 Pickle 模组来将物件储存到磁盘上(例如:保存模型、训练资料、程式状态等),并在需要时反序列化回来。

避免资料丢失:透过序列化,你可以保证资料在传输或储存过程中不会丢失或改变,并且能够以一致的方式还原。

结论

序列化是将资料结构或物件转换为可以储存或传输的格式(如字串或二进制)。反序列化是将这些格式转换回原来的资料结构或物件。这些技术对于资料储存、网路资料传输和跨平台应用程式的开发至关重要。