2016-12-07 5 views
1

Java-спецификация говорит: «настоятельно рекомендуется, чтобы все сериализуемые классы явно объявлять serialVersionUID значения, так как по умолчанию serialVersionUID вычисления очень чувствительно к деталям класса, которые могут изменяться в зависимости от реализации компилятора»Почему небезопасно полагаться на ObjectStreamClass.getSerialVersionUID?

Пожалуйста, может кто-то роет в это ? Метод getSerialVersionUID() делает отражение, а отражение используется повсеместно, так что же зависит от компилятора?

ответ

1

Brilliant объяснение этого вопроса дано в J. Bloch книге "Эффективное Java":

"Пункт 74: Реализовать Сериализуемый рассудительно":

Если вы не укажете этот номер явно объявив статическое конечное длинное поле с именем serialVersionUID, система автоматически генерирует его во время выполнения, применяя сложную процедуру к классу. На автоматически сгенерированное значение влияет имя класса, имена доменов и все его публичные и защищенные члены. При изменении любого из этих вещей в любом случае, для , например, путем добавления тривиальное удобный метод, автоматически генерируется серийный вариант UID изменения

UPD: Я был также задан вопрос в комментарии, почему компилятор-зависимый. На самом деле зависимость от компилятора здесь не о самом getSerialVersionUID() алгоритме (метод вызывается во время выполнения, конечно), но он описывается как сам класс. Например, некоторые методы синтеза могут быть добавлены в класс во время компиляции, которые также будут учитываться в SUID. Подробнее см. Метод ObjectStreamClass.computeDefaultSUID(), что он делает и как вычисляет SUID по умолчанию.

+0

но это объяснение не говорит, почему зависит от компилятора. Используется ли getSerialVersionUID() в реальном времени для вычисления значения? – ejaenv

+0

@ejaenv, посмотрите на мои обновления – Andremoniy

+1

Даже без зависимостей компилятора вы не хотите использовать алгоритм, который считает постоянную форму несовместимой при изменении полей 'static' или * методов *. Даже имеет ли класс инициализатор эффект. То, о чем не упоминается в тексте цитаты, заключается в том, что учитываются не только «все его общедоступные и защищенные члены», но и все члены пакета и частного лица, поэтому синтетические методы, такие как внутренние классы, имеют значение ... – Holger