Чем Externalizable отличается от Serializable?
Externalizable — полный ручной контроль: формат пишут writeExternal и readExternal, нужен публичный конструктор без аргументов (вызывается при восстановлении). Serializable — маркер, всё делает механизм через рефлексию.
- Компактнее и быстрее, но поддерживать вручную синхронно с классом
- Поля родителя тоже записывать самим
- Поля не могут быть final — заполняются после конструктора
А ещё На практике почти не используют — берут внешние форматы
Подробно
Serializable — маркерный интерфейс, за который всю работу делает механизм рефлексии. Externalizable отдаёт управление вам: формат определяете сами, поэтому он бывает компактнее и быстрее. Цена высока: логику сериализации приходится поддерживать вручную и синхронно с изменениями класса, наследуемые поля тоже становятся вашей заботой, а нужен ещё и публичный конструктор без аргументов — при десериализации вызывается именно он, после чего объект наполняется в readExternal. На практике оба подхода сегодня вытесняются внешними форматами вроде Protobuf, где схема отделена от классов.
Что хотят услышать
- Различие и цена ручного контроля.
Частые ошибки
- Забыть про публичный конструктор без аргументов.
- Не учесть поля суперкласса при ручной реализации.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Externalizable — маркерный интерфейс без методов, как и Serializable
- ✗Externalizable автоматически шифрует сериализованные данные
- ✗Externalizable работает только с примитивными полями
- ✓Состояние пишется и читается вручную, а при восстановлении нужен public-конструктор
Что спросят дальше
- Почему при Externalizable конструктор всё-таки вызывается?
- Когда ручной контроль формата действительно оправдан?
Разбор темы
- Сериализация и форматы данных
Java serialization и её механика, serialVersionUID, почему её опасно использовать и какие форматы выбирают вместо неё.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.