Что такое сериализация?
Сериализация — это процесс преобразования структуры данных (объекта) в линейную последовательность байтов для передачи по сети, сохранения в файл или хранения в базе данных. Обратный процесс — десериализация — восстанавливает объект из этой последовательности.
Аналогия из жизни: представьте, что вам нужно переслать собранный шкаф из IKEA другу. Вы не можете запихнуть его целиком в посылку, поэтому разбираете на плоские детали и прикладываете инструкцию по сборке. Друг получает посылку и собирает шкаф обратно. Разборка — сериализация, сборка — десериализация.
В Java существует два стандартных способа сериализации:
java.io.Serializable— стандартная сериализация через рефлексию, минимум кодаjava.io.Externalizable— расширенная сериализация с полным контролем, разработчик сам описывает логику записи/чтения
Совместимые изменения класса
Спецификация Java Object Serialization допускает ряд изменений без потери совместимости:
- добавление в класс новых полей
- изменение полей из статических в нестатические
- изменение полей из транзитных в нетранзитные
Обратные изменения (из нестатических в статические, из нетранзитных в транзитные) или удаление полей требуют дополнительной обработки в зависимости от того, какая степень обратной совместимости необходима.
Частые ошибки
- Путать сериализацию с маршаллингом — маршаллинг включает передачу кода (codebase), сериализация только данные
- Считать, что сериализация сохраняет поведение — сохраняется только состояние (поля), не методы
- Забывать, что Java-сериализация привязана к платформе — десериализовать на Python/Go не получится
На собеседовании: достаточно дать определение, назвать два интерфейса (
Serializable,Externalizable) и упомянуть, что конструктор при стандартной десериализации не вызывается. Плюсом будет отметить, что Java-сериализация в новых проектах не рекомендуется в пользу JSON/Protobuf.