Brilliant объяснение этого вопроса дано в J. Bloch книге "Эффективное Java":
"Пункт 74: Реализовать Сериализуемый рассудительно":
Если вы не укажете этот номер явно объявив статическое конечное длинное поле с именем serialVersionUID, система автоматически генерирует его во время выполнения, применяя сложную процедуру к классу. На автоматически сгенерированное значение влияет имя класса, имена доменов и все его публичные и защищенные члены. При изменении любого из этих вещей в любом случае, для , например, путем добавления тривиальное удобный метод, автоматически генерируется серийный вариант UID изменения
UPD: Я был также задан вопрос в комментарии, почему компилятор-зависимый. На самом деле зависимость от компилятора здесь не о самом getSerialVersionUID()
алгоритме (метод вызывается во время выполнения, конечно), но он описывается как сам класс. Например, некоторые методы синтеза могут быть добавлены в класс во время компиляции, которые также будут учитываться в SUID. Подробнее см. Метод ObjectStreamClass.computeDefaultSUID()
, что он делает и как вычисляет SUID по умолчанию.
но это объяснение не говорит, почему зависит от компилятора. Используется ли getSerialVersionUID() в реальном времени для вычисления значения? – ejaenv
@ejaenv, посмотрите на мои обновления – Andremoniy
Даже без зависимостей компилятора вы не хотите использовать алгоритм, который считает постоянную форму несовместимой при изменении полей 'static' или * методов *. Даже имеет ли класс инициализатор эффект. То, о чем не упоминается в тексте цитаты, заключается в том, что учитываются не только «все его общедоступные и защищенные члены», но и все члены пакета и частного лица, поэтому синтетические методы, такие как внутренние классы, имеют значение ... – Holger