Gymterview
junior

Что такое сериализация?

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

Аналогия из жизни: представьте, что вам нужно переслать собранный шкаф из IKEA другу. Вы не можете запихнуть его целиком в посылку, поэтому разбираете на плоские детали и прикладываете инструкцию по сборке. Друг получает посылку и собирает шкаф обратно. Разборка — сериализация, сборка — десериализация.

В Java существует два стандартных способа сериализации:

  • java.io.Serializable — стандартная сериализация через рефлексию, минимум кода
  • java.io.Externalizable — расширенная сериализация с полным контролем, разработчик сам описывает логику записи/чтения

Совместимые изменения класса

Спецификация Java Object Serialization допускает ряд изменений без потери совместимости:

  • добавление в класс новых полей
  • изменение полей из статических в нестатические
  • изменение полей из транзитных в нетранзитные

Обратные изменения (из нестатических в статические, из нетранзитных в транзитные) или удаление полей требуют дополнительной обработки в зависимости от того, какая степень обратной совместимости необходима.

Частые ошибки

  • Путать сериализацию с маршаллингом — маршаллинг включает передачу кода (codebase), сериализация только данные
  • Считать, что сериализация сохраняет поведение — сохраняется только состояние (поля), не методы
  • Забывать, что Java-сериализация привязана к платформе — десериализовать на Python/Go не получится

На собеседовании: достаточно дать определение, назвать два интерфейса (Serializable, Externalizable) и упомянуть, что конструктор при стандартной десериализации не вызывается. Плюсом будет отметить, что Java-сериализация в новых проектах не рекомендуется в пользу JSON/Protobuf.