Что произойдёт с полем, помеченным transient, при сериализации и последующей десериализации?
Поле не попадёт в поток, а после восстановления получит значение по умолчанию для типа (null, 0, false) — инициализатор поля и конструктор не выполняются.
- Восстановить — в readObject или лениво при первом обращении
- Применение: кэши, производные значения, ссылки на ресурсы и соединения
- Jackson transient-поля тоже по умолчанию пропускает
А ещё Конструктор первого несериализуемого предка всё же вызывается
Подробно
Это часто становится сюрпризом: восстановленный объект не проходит через конструктор, поэтому значения по умолчанию из объявления поля тоже не применяются — там будет именно значение по умолчанию для типа. Если поле нужно восстановить (кэш, производный расчёт, ссылка на ресурс), это делают в readObject или в readResolve. Помечают transient обычно то, что не имеет смысла переносить: соединения, потоки, вычисляемые кэши, а также секреты, которые не должны утечь в поток. Отдельно стоит помнить, что статические поля не сериализуются вовсе — они принадлежат классу, а не экземпляру.
Что хотят услышать
- Значение после восстановления.
- Как восстановить.
Частые ошибки
- Ожидать, что инициализатор поля отработает при десериализации.
- Забывать, что static-поля в поток не попадают.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Оно сохранит значение, которое было на момент сериализации
- ✗Оно сериализуется, но в зашифрованном виде
- ✓Сбросится к значению по умолчанию
- ✗Оно восстановится через инициализатор поля, указанный в объявлении класса
Что спросят дальше
- Как восстановить transient-поле после десериализации?
- Зачем нужен readResolve?
Разбор темы
- Сериализация и форматы данных
Java serialization и её механика, serialVersionUID, почему её опасно использовать и какие форматы выбирают вместо неё.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.