2012-04-30 2 views
11

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

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

Eclipse дал возможность выбрать "Добавить сгенерированный идентификатор серийной версии", этот вариант безопасен?

+1

Зачем вам нужны * разные классы для последовательных serialVersionUID? –

+0

Это мой стиль программирования для создания serialVersionUID серийно. –

+2

Это один общий стиль в версиях одного класса. У вашего стиля в нескольких классах есть преимущество? Когда вы позже захотите версия определенного класса, к чему вы устанавливаете serialVersionUID этого класса и что происходит с последовательными отношениями между классами? –

ответ

17

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

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

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

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

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

+2

Как насчет '@SuppressWarnings (" serial ")'? Как это изменит ситуацию? Рекомендовано, не рекомендуется? Избегайте? – ADTC

+2

@ADTC работает, но подлежит компилятору несовместимостью. См. Интерфейс Serializable. Из Java 7: «Если сериализуемый класс явно не объявляет serialVersionUID, то среда выполнения сериализации будет вычислять значение serialVersionUID по умолчанию для этого класса на основе различных аспектов класса, как описано в Спецификации сериализации объектов Java (TM). Тем не менее, [...] может варьироваться в зависимости от реализаций компилятора и может привести к неожиданному « – Kissaki

1

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

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

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

2

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

Добавить генерируется серийный номер версии ... это безопасно? Ответ: Да

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

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

+0

Спасибо за ответ. Да, я знаю, почему использовался sserialVersionUID, но мой стиль программирования генерирует их серийно в проекте в Eclipse. –

2

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

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

+0

Если вы хотите, чтобы ваш класс полезен в течение длительного времени, вы должны сделать только «совместимые изменения», все из которых определены в Спецификации сериализации объектов, которые упоминаются здесь @EJP. –