2014-02-04 2 views
5

Я создаю приложение Java, а при создании интерфейса для использования с ADT он находит необходимость инициализировать случайное число в качестве идентификационного номера.Что такое UID для серийной версии?

public class StackFullException extends RuntimeException { 
    private static final long serialVersionUID = 1L; 
    public StackFullException(){} 
    public StackFullException(String message) { 
     super(message); 
    } 
} 

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

+1

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

+1

Это, безусловно, было спрошено и ответили раньше на SO. Вы искали в архивах. – algorithmic

+1

http://stackoverflow.com/questions/5576047/why-does-serialization-require-a-serial-version-uid-in-implemented-class?rq=1, http://stackoverflow.com/questions/285793/what-is-a-serialversionuid-and-why-should-i-use-it? rq = 1, http://stackoverflow.com/questions/2258676/what-is-serial-version-id-in-java ? lq = 1 – user2864740

ответ

9

serialVersionUID является частью черной магии API-интерфейса сериализации Java.

Он используется для уникальной идентификации версии класса, так что, когда класс де-сериализован, версия может быть проверена на версию класса, загруженного с помощью ClassLoader.

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

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

Более подробную информацию можно найти в документе JavaDocs for Serializable.

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

0

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

+4

Плохая привычка, учитывая, что JVM-сгенерированный идентификатор не гарантированно будет одинаковым на разных платформах. Вы всегда должны определять свой собственный идентификатор для сериализуемых классов. –

+0

нет. Я не использую сериализацию JDK, потому что он хрупкий и ужасно сломан. Даже Брайан Гетц извинялся за него в devoxx. Я использую такие библиотеки, как jackson или xstream, которые не полагаются на такие хаки. Вне RMI (ха-ха, кто использует это?) Нет причин использовать собственную сериализацию в каком-то внешнем формате. – evanchooly

1

searialVersionUID - это всего лишь номер версии, которую вы размещаете на интерфейсе, чтобы знать, что он обменивается данными с тем же API. Другими словами, если Java-объект клиента является «1L», а сервер «2L», то он выдает ошибку пропуска.

1

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

Источник: http://www.mkyong.com/java-best-practices/understand-the-serialversionuid/

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

2

Интерфейс Serializable дает достаточно подробно в связи с этим:

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

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

Если сериализации класс не явно объявить serialVersionUID, то время выполнения сериализации будет вычислять значение по умолчанию для этого класса на основе различных аспектов класса , как описано в Java Serialization Object (Object) . Спецификация. Тем не менее, настоятельно рекомендуется, чтобы все сериализуемые классы явно объявлять serialVersionUID значения, так как по умолчанию serialVersionUID вычисление очень чувствительно к классу деталей, которые могут варьироваться в зависимости от реализации компилятора, и таким образом, может привести к неожиданным InvalidClassExceptions во десериализации. Поэтому, чтобы гарантировать согласованное значение для разных реализаций компилятора java, сериализуемый класс должен объявить явно определенное значение serialVersionUID.

Также вы можете прочитать об этом в Java Object Serialization Specification

 Смежные вопросы

  • Нет связанных вопросов^_^