Что проверяет вопрос про serialVersionUID

Этим вопросом проверяют, понимаете ли вы, что сериализация в Java — контракт между версией класса на момент записи и версией на момент чтения, а не просто дамп байт.

Если не объявить serialVersionUID явно, JVM вычисляет его сама — хэшем от имён и сигнатур полей, методов, интерфейсов класса. Добавили метод, поменяли модификатор доступа поля, даже не тронув логику — хэш другой. При десериализации старых данных это InvalidClassException, хотя структура данных совместима.

Явный serialVersionUID фиксирует версию вручную. Вы сами решаете, когда старый формат несовместим, а не компилятор за вас.

transient исключает поле из сериализации — оно не пишется в поток и восстанавливается со значением по умолчанию (null, 0, false). Если полю нужна инициализация после чтения — переопределяют readObject.

private void readObject( ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject(); if (balance < 0) { throw new InvalidObjectException( "balance"); } }

Следующий вопрос обычно про readResolve() и защиту singleton от десериализации — новый объект через readObject нарушает гарантию единственного инстанса, если явно не вернуть существующий.

Сериализация даёт совместимость между версиями класса только если о ней думают заранее, а не когда уже нужно прочитать старый файл.

Тренажёр: 600 вопросов, мок с таймером, план повторов

senior·base — что спрашивают на самом деле


В этом посте были ссылки, но мы их удалили по правилам Сетки