Подтвердить что ты не робот

Что означает предупреждение "объявить статичный окончательный serialVersionUID" и как его исправить?

Возможный дубликат:
Что это значит: Сериализуемый класс не объявляет статическое окончательное поле serialVersionUID?

Предупреждение о компиляторе Java: The serializable class [*****] does not declare a static final serialVersionUID field of type long.

Почему? Как это исправить?

4b9b3361

Ответ 1

Это объясняется довольно хорошо здесь:

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

Вы исправляете ошибку, добавляя

private static final long serialVersionUID = 7526472295622776147L;  // unique id

для класса.

Дальнейшее чтение:


Примечание: Если вы используете Eclipse, и если вы (и никто другой) никогда не планируете сериализовать свои классы, вы также можете подавить ошибку, перейдя в

      Window → Предпочтения → Java → Компилятор → Ошибки/Предупреждения

и выберите "Игнорировать" в "Сериализуемый класс без serialVersionUID".

Ответ 2

просто добавьте

private static final long serialVersionUID = 1L;//or some long

Docs описывают это довольно хорошо

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

ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;

Если a сериализуемый класс явно не объявите serialVersionUID, затем сериализация будет вычислять Значение по умолчанию serialVersionUID для этот класс, основанный на различных аспектах класс, как описано в Сериализация объектов Java (TM) Спецификация. Однако это сильно рекомендовал, чтобы все сериализуемые классы явно объявляют serialVersionUID, поскольку вычисление по умолчанию serialVersionUID очень чувствителен к деталям класса которые могут различаться в зависимости от компилятора реализации и, следовательно, может в неожиданных InvalidClassExceptions во время десериализации. Поэтому для гарантировать согласованное Значение serialVersionUID в другой java-компилятор реализации, сериализуемый класс должен объявить явный Значение serialVersionUID. Это также настоятельно рекомендовал, чтобы явные В объявлениях serialVersionUID используется по возможности, частный модификатор, поскольку такие заявления применяются только к немедленно объявляя class - serialVersionUID не являются полезны как унаследованные.

Также см.

Ответ 3

Объявите это следующим образом:

private static final long serialVersionUID = -4673040337179571462L;

Его требуется с помощью сериализуемого интерфейса.

Ответ 4

Вы расширяете объект Swing?

Я часто использую аннотацию @suppressWarnings, чтобы избавиться от этого предупреждения.

Я думаю, что вопрос о пресечении предупреждения или предоставлении уникального идентификатора зависит от масштаба вашего приложения и предполагаемого использования сериализации объекта.