ПрограммированиеFullstack разработчик

Что такое сериализация и десериализация объектов в Python? Какие модули для этого используются, когда применять pickle, а когда json, и в чем их принципиальные различия?

Проходите собеседования с ИИ помощником Hintsage

Ответ.

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

Исторически в 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 сериализует (почти) любые объекты Python, но опасен и не универсален.
  • json сериализует только базовые типы, зато безопасен и кросс-языковой.
  • Всегда думайте о безопасности и области применения.

Вопросы с подвохом.

Можно ли отдавать через pickle ответы HTTP API во внешние системы?

Нет! pickle не является стандартом обмена данных между языками и крайне небезопасен: загрузка из pickle может выполнять посторонний код. json гораздо лучше для внешнего взаимодействия.

Можно ли сериализовать функции, классы или лямбда-функции в json?

Нет. json работает только с примитивными типами; функции и классы не сериализует ни стандартный json, ни большинство парсеров.

Может ли pickle сериализовать объекты с циклическими ссылками?

Да, pickle автоматически обрабатывает большинство циклических ссылок, вплоть до рекурсивных структур. Для json это обычно фатальная ошибка.

Типовые ошибки и анти-паттерны

  • Сериализация с pickle пользовательских данных из ненадежных источников — критическая уязвимость.
  • Попытка сериализовать нестандартные типы (например, datetime) через json без доработки — получим ошибку.
  • Хранение pickle-файлов на сервере без контроля безопасности.

Пример из жизни

Негативный кейс: Передача pickle-объектов клиентским приложениям для обмена данными.
Плюсы: простая реализация, сохраняются все типы Python.
Минусы: критически опасно, невозможно взаимодействовать с другими языками.

Положительный кейс: Отправка данных через json, преобразование нестандартных типов с помощью encoder-ов.
Плюсы: безопасность, совместимость, гибкость.
Минусы: ограничение по поддерживаемым типам, иногда требует кастомный encoder/decoder.