Имеет ли значение то, что я выбираю для serialVersionUID при расширении классов Serializable в Java?

Я расширяю класс (ArrayBlockingQueue), который реализует Serializable interface. Документация Sun (и моя IDE) сообщает мне, что я должен установить это значение, чтобы предотвратить вред:

Тем не менее, настоятельно рекомендуется, чтобы все сериализуемые классы явно объявляли значения serialVersionUID, так как вычисление по умолчанию serialVersionUID очень чувствительно к деталям класса, которые могут различаться в зависимости от реализаций компилятора и, таким образом, могут приводить к неожиданным InvalidClassExceptions во время десериализации.

Теперь мне было все равно, о чем стоить. Это имеет значение?

Ответ 1

Нет - пока вы меняете его в нужное время (т.е. когда вы вносите изменения, которые влияют на сериализацию, например, удаляя поле), не имеет значения, какое значение вы используете.

Для простоты я предлагаю начинать с 0 и увеличивать его на 1 каждый раз, когда вам нужно.

спецификация сериализации содержит более подробную информацию.

Ответ 2

Единственное, что важно для serialVersionUID, это то, что двоично-совместимые сериализованные версии класса имеют одинаковый serialVersionUID; то есть, если вы не внесли каких-либо изменений в сериализованную форму класса, все будет хорошо.

Конечно, лучший вариант - использовать расширенные параметры, которые сериализуются для вас, чтобы никогда не было никаких изменений. Я бы предложил прочитать о readResolve() et al. Эффективная Java охватывает некоторые из более сложных проблем в этой области.