Использовать serialVersionUID или отключить предупреждения?

66
задан Steven Bluen 2 July 2013 в 01:23
поделиться

10 ответов

Если Вы не планируете сериализировать экземпляры, добавьте SuppressWarning.

сгенерированный последовательный идентификатор А может быть немного опасным. Это предполагает, что Вы намеренно дали ему порядковый номер и что это - сохранение, чтобы сериализировать и десериализовать. Легко забыть обновлять порядковый номер в более новой версии Вашего приложения, где Ваш класс изменяется. Десериализация перестанет работать, если поля класса были изменены. Наличие SuppressWarning, по крайней мере, говорит читателю Вашего кода, что Вы не намеревались сериализировать этот класс.

18
ответ дан Benno Richters 24 November 2019 в 15:05
поделиться

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

Иначе кто-то мог бы в будущем сериализировать Ваш объект через родительский класс и заканчиваться с сериализированной формой значения по умолчанию где:

  • форма не совместима между различными версиями Вашего кода.
  • Вы подавили предупреждение это дело обстоит так.

Добавление идентификатора походит на bodge, начиная с того, что Вы действительно хотите сделать, не, сериализируют. Ожидание, что вызывающие стороны не сериализируют Ваш объект, означает, что Вы ожидаете, что они будут "знать", когда их HttpServlet будет иметь Ваш класс. То нарушение полиморфизма находится на Вашей голове для того, чтобы иметь сериализуемый объект, который не должен быть сериализирован, и наименьшее, которое можно сделать, удостоверяются, что неосторожные вызывающие стороны знают об этом.

27
ответ дан Steve Jessop 24 November 2019 в 15:05
поделиться

Даже если Вы знаете, что этот объект будет сериализирован нет никакой потребности генерировать serialVersionUID, потому что Java автоматически генерирует его для Вас и будет автоматически отслеживать изменения, таким образом, Ваша сериализация будет всегда работать просто великолепно. Необходимо генерировать его, только если Вы знаете то, что Вы делаете (обратная совместимость сериализации, ручное отслеживание изменений и т.д.)

, Таким образом, я сказал бы, что подавление предупреждения является лучшим и самым безопасным решением в большинстве случаев.

6
ответ дан serg 24 November 2019 в 15:05
поделиться

Я отказываюсь быть терроризированным Eclipse в добавляющую помеху к моему коду!

я просто настраиваю Eclipse для не генерации предупреждений при пропавших без вести serialVersionUID.

14
ответ дан ykaganovich 24 November 2019 в 15:05
поделиться

Хорошо генерировать SVUID к каждый класс, реализующий сериализуемый. Причина проста. Вы никогда не знаете, когда это будет сериализировано Вами или некоторой третьей стороной. Там может быть настроен много сервисов, которые сериализируют сервлеты. Поскольку каждый IDE существует плагин, который генерирует один, или просто используйте шаблон и установите svuid = 1L.

4
ответ дан Rastislav Komara 24 November 2019 в 15:05
поделиться

То предупреждение сводит меня с ума, потому что каждый раз Вы разделяете класс Swing на подклассы, Вы знаете , Вы никогда не собираетесь сериализировать его, но существует то, что глупое предупреждение. Но да, я позволяю Eclipse генерировать тот.

3
ответ дан Paul Tomblin 24 November 2019 в 15:05
поделиться

Позвольте Eclipse генерировать идентификатор. Быстрый и легкий. Предупреждения не состоят в том, чтобы быть проигнорированы. Также сохраняет Вас, большая проблема должна Вы когда-либо переходить к сути дела где объект/has/, чтобы быть сериализированными.

2
ответ дан xmjx 24 November 2019 в 15:05
поделиться

Если Вы не учтете serialVersionUID java, то генерирует один для класса во время компиляции (он изменяется с каждой компиляцией).

При десериализации объектов serialVersionUID десериализованного объекта сравнивается с serialVersionUID класса в jvm. Если они отличаются, их считают несовместимыми, и Исключение выдается. Это может произойти, например, после обновления Вашей программы и десериализации старых классов.

я всегда использую 1L для serialversionUID. Это не причиняет боль (по сравнению со сгенерированным значением по умолчанию), и это все еще оставляет опцию повреждающейся совместимости позже путем постепенного увеличения идентификатора.

2
ответ дан Glever 24 November 2019 в 15:05
поделиться

Перейдите по этой ссылке для получения подробного объяснения: http://technologiquepanorama.wordpress.com/2009/02/13/what-is-use-of-serialversiouid/

2
ответ дан Michael Myers 24 November 2019 в 15:05
поделиться

Спасибо @ Steve Jessop за его ответ. Это было 5 строк кода ... не было проблем.

Я добавил @SuppressWarnings ("serial") чуть выше рассматриваемого класса.

Я также добавил этот метод:

private void writeObject(ObjectOutputStream oos) throws IOException {
   throw new IOException("This class is NOT serializable.");
}

Надеюсь, Стив имел в виду именно это :)

9
ответ дан 24 November 2019 в 15:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: