Зачем нужен serialVersionUID?
serialVersionUID — версия класса для встроенной сериализации. При несовпадении версии в потоке и у локального класса — InvalidClassException. Если не объявить, JVM вычислит её из структуры класса, и любое изменение (даже новый метод) сломает совместимость.
- Объявляют явно: private static final long serialVersionUID = 1L
- Меняют, когда изменение несовместимо
- transient — исключить поле из сериализации
А ещё Для обмена данными лучше JSON или Protobuf
Подробно
Если serialVersionUID у потока и локального класса не совпадает, десериализация падает InvalidClassException. transient исключает поле из стандартной сериализации.
Что хотят услышать
- Назначение и поведение при несовпадении.
- Почему объявлять явно.
Частые ошибки
- Десериализовать непроверенные данные.
- Думать, что static поля сериализуются как состояние объекта.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Это уникальный идентификатор объекта
- ✗Он шифрует сериализованные данные
- ✗Без него сериализация не работает вовсе и бросает NotSerializableException
- ✓Это версия класса: при несовпадении — InvalidClassException
Что спросят дальше
- Что делает transient?
- Чем Externalizable отличается от Serializable?
Разбор темы
- Сериализация и форматы данных
Java serialization и её механика, serialVersionUID, почему её опасно использовать и какие форматы выбирают вместо неё.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.