Сериализация — это процесс преобразования объекта в поток байтов (или строку), чтобы сохранить или передать его по сети, а десериализация — обратная операция.
Исторически в Python основной проблемой была стандартизация обмена сложными структурами данных между различными приложениями и языками. Для этого в стандартной библиотеке появились различные модули: сначала pickle для сериализации любых Python-объектов, а позже json для универсального обмена с внешними системами.
Проблема: pickle хранит Python-специфичные данные, небезопасен (может выполнить произвольный код при загрузке) и не совместим с другими языками, json — ограничен простыми типами (dict, list, str, int, float, bool и None), но безопаснее и широко используется для обмена между разными технологиями.
Решение: использовать pickle только для доверенных данных между Python системами; применять json для обмена с внешними сервисами, веб-разработки и передачи структуры человеком читаемых данных.
Пример кода:
import pickle import json data = {'a': [1, 2, 3], 'b': True} # Сериализация с pickle pickled = pickle.dumps(data) # байты unpickled = pickle.loads(pickled) print(unpickled) # Сериализация с json jsoned = json.dumps(data) # строка unjsoned = json.loads(jsoned) print(unjsoned)
Ключевые особенности:
Можно ли отдавать через pickle ответы HTTP API во внешние системы?
Нет! pickle не является стандартом обмена данных между языками и крайне небезопасен: загрузка из pickle может выполнять посторонний код. json гораздо лучше для внешнего взаимодействия.
Можно ли сериализовать функции, классы или лямбда-функции в json?
Нет. json работает только с примитивными типами; функции и классы не сериализует ни стандартный json, ни большинство парсеров.
Может ли pickle сериализовать объекты с циклическими ссылками?
Да, pickle автоматически обрабатывает большинство циклических ссылок, вплоть до рекурсивных структур. Для json это обычно фатальная ошибка.
Негативный кейс: Передача pickle-объектов клиентским приложениям для обмена данными.
Плюсы: простая реализация, сохраняются все типы Python.
Минусы: критически опасно, невозможно взаимодействовать с другими языками.
Положительный кейс: Отправка данных через json, преобразование нестандартных типов с помощью encoder-ов.
Плюсы: безопасность, совместимость, гибкость.
Минусы: ограничение по поддерживаемым типам, иногда требует кастомный encoder/decoder.