Имеет ли значение, что я выбираю для serialVersionUID при расширении Serializable классов в Java? - PullRequest
41 голосов
/ 03 марта 2009

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

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

Теперь, мне наплевать на то, какую ценность в них вкладывать. Имеет ли это значение?

Ответы [ 2 ]

70 голосов
/ 03 марта 2009

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

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

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

12 голосов
/ 03 марта 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...