Разве подавление предупреждений не лучший вариант, чем добавление serialVersionUID в этом сценарии? - PullRequest
4 голосов
/ 26 августа 2011

Общий сценарий в веб-приложениях:

  • Приложение имеет множество классов, которые должны храниться в Session и могут быть сериализуемыми
  • разработчик получает кучу предупреждений о том, что «Сериализуемый класс не реализует serialVersionUID»
  • разработчик пожимает плечами и нажимает на IDE "add serialversionUID", и проблема решается?

Мне не нравится автоматическое добавление serialVersionUID в принципе, поскольку решение по сути означает, что

  • самое главное, что разработчик заявляет: «Я знаю, когда мои изменения нарушают сериализацию, а когда нет, и хочу контролировать это вместо JVM», когда на самом деле не знает эти вещи и не хочет контролировать их
  • добавление serialVersionUID = 6266256561409620894L сбивает с толку и выглядит ужасно (хорошо, вы можете использовать 1 л)

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

В типичном веб-приложении не очень важно, когда сериализация классов прерывается или нет. При развертывании новой версии некоторые посторонние сериализованные сеансы могут быть прерваны, но обычно это не является проблемой (и лишь немногие приложения правильно обрабатывают совместимость версий с сериализованными sessios).

Итог: разве совет "Всегда всегда определять serialVersionUID явно в ваших исходных файлах" упрощен?

Ответы [ 4 ]

1 голос
/ 27 августа 2011

Редко не рекомендуется указывать serialVersionUID.

  • Если вы опустите его, малейшее изменение класса сделает его несовместимым с предыдущими сериализациями, и вы получите исключения сериализации.

  • Если вы предоставите его, а затем измените класс способом, совместимым со спецификацией сериализации объектов, разделом «Управление версиями объектов», это работает, поэтому вы уже впереди. И это охватывает множество случаев: в частности, все случаев, когда единственное, что изменилось, - это метод.

  • Если вы измените класс способом, несовместимым с этой спецификацией, вы получите исключение сериализации и затем сможете его исправить.

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

1 голос
/ 26 августа 2011

Не уверен, если вы спрашиваете о том, сколько воды содержится в советах по определению serialVersionUID в исходном коде, или просто говорите, что при условии класс не требуется сериализовать, если лучше обойтипредупреждение путем непосредственного его подавления или нежелательного определения serialiVersionUID в любом случае.

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

1 голос
/ 26 августа 2011

Я согласен с вами и сделаю то же самое с моим текущим проектом: это предупреждение полностью отключено в настройках компилятора.

0 голосов
/ 26 августа 2011

Вы абсолютно правы. Вы должны добавлять serialVersionUID только в том случае, если вы понимаете, что это на самом деле делает, и уверены, что это правильно. Вы, очевидно, понимаете, что он на самом деле делает, и уверены, что это не правильная вещь, поэтому не добавляйте ее.

Я вижу, что многие программисты рефлексивно добавляют serialVersionUID, потому что он закрывает компилятор и не требует добавления @SuppressWarnings. Это неправильно, и они плохие люди.

Итог: совет «Всегда определять serialVersionUID явно в ваших исходных файлах» не является упрощенным, он совершенно неправильный.

...