Что такое serialVersionUID и почему я должен его использовать?

Внешние ключи - это просто ограничения - они упрощают сохранение целостности данных, но не требуют корреляции таблиц. Wordpress использует MySQL и MySQL может использовать множество «движков» для хранения таблиц, но AFAIK только один из них (InnoDB) поддерживает внешние ключи. Wordpress, вероятно, решил не использовать его по соображениям производительности.

2817
задан Jigar Joshi 17 March 2015 в 22:44
поделиться

7 ответов

Документы для [1 117] java.io.Serializable являются, вероятно, почти столь хорошим объяснением, как Вы доберетесь:

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

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

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

2168
ответ дан Mike B. 18 March 2015 в 08:44
поделиться
  • 1
    Я добавил новые предложения к своему ответу. – user2105505 20 January 2014 в 06:40

Я не могу отказаться от этой возможности включить книгу Josh Bloch Эффективный Java (2-й Выпуск). Глава 11 является необходимым ресурсом на сериализации Java.

На Josh, автоматически сгенерированный UID сгенерирован на основе имени класса, реализовал интерфейсы и всю общественность и защитил участников. Изменение любого из них всегда изменится serialVersionUID. Таким образом, Вы не должны смешивать с ними, только если Вы уверены, что не больше, чем одна версия класса будет когда-либо сериализироваться (или через процессы или получаться от устройства хранения данных в более позднее время).

, Если Вы игнорируете их на данный момент и находите позже, что необходимо изменить класс в некотором роде, но поддержать совместимость w/старая версия класса, можно использовать инструмент JDK serialver, чтобы генерировать serialVersionUID на старый класс, и явно установить это на новом классе. (В зависимости от Ваших изменений Вы, возможно, должны также реализовать пользовательскую сериализацию путем добавления writeObject и readObject, методы - видят Serializable javadoc или вышеупомянутая глава 11.)

291
ответ дан kkishere 17 March 2015 в 22:44
поделиться
  • 1
    я прошу, чтобы список массива не выстроил – Pinki 3 March 2011 в 09:41

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

10
ответ дан 17 March 2015 в 22:44
поделиться
  • 1
    Если это все еще doesn' t работа, изменение разрешение файла добьется цели. – lifelogger 2 December 2013 в 15:44

Можно сказать Eclipse игнорировать эти serialVersionUID предупреждения:

Окно> Предпочтения> Java> Компилятор> Ошибки / Предупреждения> Потенциальные Проблемы программирования

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

  • Потенциальные Проблемы программирования: Возможное случайное булево присвоение
  • Потенциальные Проблемы программирования: Доступ к нулевому указателю
  • Ненужный код: Локальная переменная никогда не читается
  • Ненужный код: Избыточная пустая проверка
  • Ненужный код: Ненужный бросок или 'instanceof'

и многое другое.

129
ответ дан matt b 17 March 2015 в 22:44
поделиться

Если Вы сериализируете просто, потому что необходимо сериализировать для пользы реализации (кто заботится, сериализируете ли Вы для HTTPSession, например..., если она хранится или нет, Вы, вероятно, не заботитесь [приблизительно 111] об объекте формы), то можно проигнорировать это.

при фактическом использовании сериализации только имеет значение, если Вы планируете хранение и получение объектов с помощью сериализации непосредственно. Эти serialVersionUID представляет Вашу версию класса, и необходимо увеличить ее, если текущая версия класса не назад совместима со своей предыдущей версией.

Большую часть времени, Вы не будете, вероятно, использовать сериализацию непосредственно. Если это верно, генерируйте значение по умолчанию SerialVersionUID путем нажатия на опцию быстрого исправления и не волнуйтесь об этом.

448
ответ дан surendrapanday 17 March 2015 в 22:44
поделиться
  • 1
    There' s никакой способ поместить ArrayLists в xml? – Klaus 3 March 2011 в 09:45

Если Вы никогда не должны будете сериализировать свои объекты к массиву байтов и отправлять/хранить их, то Вы не должны волноваться об этом. Если Вы делаете, то необходимо рассмотреть serialVersionUID, так как deserializer объекта будет соответствовать ему к версии объекта, который имеет ее classloader. Читайте больше об этом в Спецификации языка Java.

36
ответ дан Paul Brinkley 18 March 2015 в 08:44
поделиться
  • 1
    Я don' t полностью понимают Ваш комментарий, но я пытался отредактировать свой ответ соответственно – Valentin Rocher 14 May 2014 в 02:25

Что такое SerialVersionUID? Ответ: - позволяет, говорят, что существует два человека, один от HQ и другого от ODC, оба собираются выполнить сериализацию и десериализацию соответственно. В этом случае для аутентификации этого получатель, кто находится в ODC, является аутентифицируемым человеком, JVM создает Уникальный идентификатор, который известен как SerialVersionUID.

Вот хорошее объяснение на основе сценария,

Почему SerialVersionUID?

Сериализация : Во время сериализации с каждой объектной стороной отправителя JVM сохранит Уникальный идентификатор. JVM ответственна для генерации того уникального идентификатора на основе соответствующего .class файла, который присутствует в системе отправителя.

Десериализация : Во время десериализации сторона получателя JVM сравнит уникальный идентификатор, связанный с Объектом с Уникальным идентификатором локального класса, т.е. JVM также создаст Уникальный идентификатор на основе соответствующего .class файла, который присутствует в системе получателя. Если оба уникальных идентификатора, подобранные затем только десериализация, будут выполнены. Иначе мы получим высказывание Исключения на этапе выполнения InvalidClassException. Этот уникальный идентификатор является только SerialVersionUID

0
ответ дан 22 November 2019 в 19:47
поделиться
Другие вопросы по тегам:

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