Что такое сериализация данных в Python?

Ответ

Сериализация — это процесс преобразования объектов Python (например, словарей, списков, экземпляров классов) в формат, который можно легко сохранить (например, в файл) или передать по сети (например, через API). Обратный процесс, восстановление объекта из этого формата, называется десериализацией.

Почему сериализация важна?

  • Персистентность: Позволяет сохранять состояние объектов для последующего использования (например, кэширование данных, сохранение настроек приложения).
  • Передача данных: Обеспечивает обмен данными между различными приложениями, сервисами или даже языками программирования (например, JSON для веб-API).
  • Межпроцессное взаимодействие: Упрощает передачу объектов между разными процессами в одной системе.

Распространенные форматы и модули в Python:

  • JSON (JavaScript Object Notation): Человекочитаемый, текстовый формат, широко используемый для веб-API и обмена данными между различными языками. В Python используется модуль json.
  • Pickle: Бинарный формат, специфичный для Python. Позволяет сериализовать практически любые объекты Python. Используется модуль pickle. Внимание: Десериализация данных из недоверенных источников с помощью pickle небезопасна, так как может привести к выполнению произвольного кода.
  • YAML (YAML Ain't Markup Language): Человекочитаемый формат, часто используемый для конфигурационных файлов. В Python есть сторонняя библиотека PyYAML.
  • XML (Extensible Markup Language): Структурированный текстовый формат, исторически популярный для обмена данными. В Python есть встроенный модуль xml.etree.ElementTree.

Пример сериализации и десериализации с использованием json:

import json

# Объект Python (словарь)
data = {
    "name": "Alice",
    "age": 30,
    "is_student": False,
    "courses": ["Math", "Physics"]
}

print("Исходный объект Python:", data)

# --- Сериализация: объект Python -> JSON-строка ---
# json.dumps() преобразует объект Python в JSON-строку.
# indent=4 делает вывод более читаемым.
json_string = json.dumps(data, indent=4)
print("nСериализованная JSON-строка:")
print(json_string)

# --- Десериализация: JSON-строка -> объект Python ---
# json.loads() преобразует JSON-строку обратно в объект Python.
loaded_data = json.loads(json_string)
print("nДесериализованный объект Python:", loaded_data)

# Доступ к данным после десериализации
print(f"Возраст из десериализованных данных: {loaded_data['age']}") # 30
print(f"Первый курс: {loaded_data['courses'][0]}") # Math