О сгенерированном serialVersionUID в Eclipse

Есть ли способ сгенерировать serialVersionUID в Eclipse серийно? Последовательно я хочу иметь в виду, что если один сериализуемый класс имеет serialVersionUID = 1L, тогда, когда я сгенерирую serialVersionUID другого класса, это будет serialVersionUID = 2L.

Если я вручную укажу 1L, 2L, 3L и так далее, может ли это создать какие-либо проблемы?

В Eclipse есть возможность выбрать «Добавить сгенерированный идентификатор серийной версии». Безопасен ли этот вариант?


person Tapas Bose    schedule 30.04.2012    source источник
comment
Почему вы хотите, чтобы разные классы имели серийные идентификаторы serialVersionUID?   -  person Andy Thomas    schedule 30.04.2012
comment
Это мой стиль программирования - серийно генерировать serialVersionUID.   -  person Tapas Bose    schedule 30.04.2012
comment
Это общий стиль для версий одного класса. Есть ли у вашего стиля работы в нескольких классах преимущества? Когда позже вы захотите создать версию определенного класса, для чего вы установите serialVersionUID этого класса и что произойдет с последовательными отношениями между классами?   -  person Andy Thomas    schedule 30.04.2012


Ответы (4)


Нет, это не создаст никаких проблем ни в одном из ваших двух обстоятельств:

  • вы можете вручную указать его постепенно
  • вы можете позволить Eclipse назначать им случайные сгенерированные значения
  • вы можете оставить их все 1L для разных классов

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

Это обстоятельство встречается очень редко, особенно при работе с вашим собственным проектом, который не является частью больших фреймворков, которые полагаются на сериализацию. Так что можете спокойно делать все, что захотите.

Ситуация, когда вы хотите иметь разные серийные номера для одного и того же класса, - это когда вы обновляете класс и хотите запретить его сериализацию с помощью предыдущего объявления ЖЕСТКОГО класса.

person Jack    schedule 30.04.2012
comment
А что насчет @SuppressWarnings("serial")? Как это изменит ситуацию? Рекомендуется, а не рекомендуется? Избегать? - person ADTC; 20.09.2013
comment
@ADTC работает, но может быть несовместим с компилятором. См. Сериализуемый интерфейс. Из Java 7: «Если сериализуемый класс явно не объявляет serialVersionUID, то среда выполнения сериализации вычислит значение serialVersionUID по умолчанию для этого класса на основе различных аспектов класса, как описано в Спецификации сериализации объектов Java ™. Однако […] может различаться в зависимости от реализаций компилятора и, таким образом, может привести к неожиданным результатам » - person Kissaki; 12.09.2014

Позвольте мне ответить на ваши вопросы задом наперед:

Добавить сгенерированный идентификатор серийной версии ... это безопасно? Ответ: да

Если вы вручную укажете 1L, 2L, 3L, это проблема: не больше проблема, чем сделать их все 1 или любое другое число

последовательная генерация серийных идентификаторов: ответ заключается в том, что для этого нет встроенного механизма. Тот факт, что вы задаете этот вопрос, заставляет меня думать, что вы не знаете, для чего нужен serialVersionUID. Даже если вы уже читали о том, что это значит, вам следует прочитать это еще раз.

person ControlAltDel    schedule 30.04.2012
comment
Спасибо за ответ. Да, я знаю, почему использовался sserialVersionUID, но мой стиль программирования заключается в том, чтобы генерировать их серийно в проекте в Eclipse. - person Tapas Bose; 30.04.2012

Вы вообще не должны этого делать. Идея состоит в том, что вы сохраняете константу serialVersionUID как можно дольше во время эволюции класса, соблюдая правила в разделе «Управление версиями объектов» Спецификации сериализации объектов.

Ваш «стиль программирования» тут ни при чем. Речь идет о том, чтобы использовать вещь по назначению. Он не предназначен для той цели, для которой вы его используете. Системы контроля исходного кода могут сделать это за вас.

person user207421    schedule 01.05.2012
comment
Если вы хотите, чтобы ваш класс был полезным в течение длительного времени, вам следует вносить только совместимые изменения, все из которых определены в Спецификации сериализации объектов, упоминаемой @EJP, здесь. - person Christopher Schultz; 04.12.2015

сериализация java поддерживает то, что все классы имеют одинаковый serialVersionUID

это используется для контроля версий, поэтому сериализованные объекты из более старого определения несовместимы с более новой версией

проверьте http://java.sun.com/developer/technicalArticles/Programming/serialization/ для уточнения деталей (прокрутите вниз до «контроля версий»)

person ratchet freak    schedule 30.04.2012