Gymterview
middle

Какое влияние оказывают на сериализуемость модификаторы полей static и final?

Модификаторы static и final ведут себя по-разному при стандартной сериализации (Serializable) и расширенной (Externalizable).

static-поля

Поля с модификатором static не сериализуются при стандартной сериализации, так как принадлежат классу, а не экземпляру. После десериализации статическое поле будет содержать текущее значение из JVM, а не то, которое было в момент сериализации.

При использовании Externalizable статическое поле можно записать и прочитать вручную, но это не рекомендуется — это побочный эффект, влияющий на все экземпляры класса, что ведёт к трудноуловимым ошибкам.

final-поля

При стандартной сериализации final-поля сериализуются и десериализуются как обычные поля — JVM обходит ограничение final через внутренние механизмы.

При использовании Externalizable final-поля невозможно десериализовать: конструктор по умолчанию инициализирует их начальным значением, а изменить в readExternal() уже нельзя.

Сводная таблица

Модификатор Serializable Externalizable
static Не сериализуется Можно, но не рекомендуется
final Сериализуется нормально Невозможно десериализовать
static final Не сериализуется (константа класса) Можно записать, но бессмысленно

На собеседовании: ключевое ограничение — final-поля нельзя восстановить через Externalizable, поэтому если в классе есть final-поля, нужно использовать Serializable. Это частый вопрос-ловушка.