Сериализуемый класс явно или неявно, но всегда имеет
serialVersionUID. Это число типа
long, которое представляет собой «версию» сериализационной формы класса. Если при сериализации/десериализации значения
serialVersionUID не совпадают – будет выброшено
InvalidClassException.
Для
совпадающих версий работает мощная поддержка эволюции класса –
совместимые изменения, такие как добавление или удаление полей, не приводят к
InvalidClassException.
Неявное значение вычисляется автоматически в рантайме, и включает в себя информацию о имени типа, списке родителей и полей (с точностью до коллизии). По смыслу это похоже на хэш-сумму
класса. Соответственно, при любом изменении класса значение изменится, и поддержка эволюции окажется бесполезной.
Всегда лучше
явно указывать
любое значение
serialVersionUID, и изменять только в тех редких случаях, когда требуется сломать совместимость с предыдущими версиями. Стандартная утилита JDK
serialver умеет «угадывать» авто-генерированное значение. Она используется чтобы зафиксировать значение для включения поддержки эволюции созданного ранее класса.
Явное значение устанавливается в переменную
static final long serialVersionUID.