JavaRush /Java блог /Random UA /Навіщо використовувати SerialVersionUID всередині Seriali...
0xFF
9 рівень
Донецк

Навіщо використовувати SerialVersionUID всередині Serializable класу в Java

Стаття з групи Random UA
Serializationі SerialVersionUIDзавжди залишається загадкою для багатьох Java-розробників. Я часто бачу питання щодо того, що таке SerialVersionUID, або що станеться, якщо я не оголошу SerialVersionUIDв моєму Serializableкласі? Крім заплутаного і рідкісного використання, є ще одна причина для цього питання - це попередження Навіщо використовувати SerialVersionUID всередині Serializable класу в Java - 1Eclipse IDE про відсутність ,SerialVersionUID наприклад: " long"). У цій статті, ви зможете не тільки дізнатися основи Java , але і його вплив на процес серіалізації та десеріалізації. Коли ви оголошуєте клас, як шляхом реалізації інтерфейсу-маркераSerializableCustomerSerialVersionUIDSerialVersionUIDSerializablejava.io.Serializable, середовище виконання Java зберігає екземпляр цього класу на диску за допомогою механізму серіалізації за промовчанням, якщо ви не налаштували процес використання інтерфейсу Externalizable . Під час серіалізації, середовище виконання Java створює номер версії для класу, так що вона може десереалізувати його пізніше. У Java цей номер версії відомий як SerialVersionUID. Якщо під час десеріалізації, SerialVersionUIDне відповідає, то процес завершиться з винятком InvalidClassExceptionу потоці " main" java.io.InvalidClassException, а також надрукує ім'я класу та відповідний SerialVersionUID. Швидке рішення для виправлення цієї проблеми – скопіювати SerialVersionUIDта визначити його як константу типу private static final longу вашому класі. У цій статті ми дізнаємося про те, чому ми повинні використовуватиSerialVersionUIDJava і як використовувати інструмент serialver JDK для генерації цього ID. Якщо ви новачок у серіалізації, ви також можете подивитися Топ 10 питань про серіалізацію Java на інтерв'ю , щоб оцінити свої знання і знайти прогалини у вашому розумінні для подальшого читання. Подібно Concurrency(паралельності) і Multi-threading(багатопоточності), Serialization(серіалізація) це вже інша тема, яка заслуговує на читання кілька разів.

Навіщо використовувати SerialVersionUID в Java

Як я сказав, коли ми не визначабо значення, SerialVersionUIDяк static final longу нашому класі, механізм серіалізації зробить це за нас. Цей механізм чутливий до багатьох деталей, включаючи поля вашого класу, їх модифікатори доступу, інтерфейси, які він реалізує і навіть різні реалізації компілятора, будь-які зміни в класі або використання іншого компілятора може дати результат іншого, який зрештою зупинить перезавантаження серіалізованих даних SerialVersionUID. ризиковано покладатися на механізм серіалізації Java для генерації цього id, тому рекомендується явно визначати SerialVersionUIDу вашому Serializable-класі . Я наполегливо раджу прочитати класику Java - Joshua Bloch "Effective Java"для розуміння серіалізації Java та проблем неправильної їх обробки. До речі, JDK також надає інструмент serialver, який розташований в директорії bin каталогу JAVA_HOME , на моєму комп'ютері C:\Program Files\Java\jdk1.6.0_26\bin\serialver.exe , який може бути використаний для генерування SerialVersionUIDдля старих класів. Це дуже корисно у випадку, якщо ви внесли зміни до вашого класу, який порушує серіалізацію і ваш додаток не може перезавантажити серіалізовані екземпляри. Ви легко можете використовувати цю утиліту для створення SerialVersionUIDдля старих екземплярів, а потім використовувати його у явному вигляді оголосивши поле як private static final long SerialVersionUID. До речі, дуже рекомендується з міркувань продуктивності та безпеки використовувати звичайний двійковий формат для серіалізації, знову ж таки “Effective Java” має кілька параграфів, які демонструють переваги звичайного формату в найдрібніших деталях.

Як використовувати утиліту serialver JDK для генерування SerialVersionUID

Ви можете використовувати serialverдля створення SerialVersionUIDкласів. Це особливо корисно для класів, що розвиваються, утиліта повертає SerialVersionUIDу форматі легкому для копіювання. Ви можете використовувати утиліту serialverJDK як показано у прикладі:
$ serialver
use: serialver [-classpath classpath] [-show] [classname...]
$ serialver -classpath . Hello
Class Hello is not Serializable.
$ serialver -classpath . Hello
Hello: static final long SerialVersionUID = -4862926644813433707L;
Ви також можете використовувати утиліту serialverу GUIвигляді використовуючи команду $ serialver –show, це відкриє інспектор serial version, який приймає повне ім'я класу та показує його Serial version.

Резюме

Тепер ми знаємо, що таке SerialVersionUIDі чому важливо оголошувати його в Serializable-класі, саме час переглянути деякі важливі факти, пов'язані з Java SerialVersionUID.
  1. SerialVersionUIDвикористовується для визначення версії серіалізованих даних.

  2. Коли ми не оголошуємо SerialVersionUIDв нашому класі, середовище виконання Java робить це за нас, але цей процес чутливий до багатьох метаданих класу, включаючи кількість полів, тип полів, модифікатори доступу полів, інтерфейсів, які реалізовані в класі та ін. Ви можете знайти точну інформацію в документації про серіалізацію від Oracle.

  3. Рекомендується оголошувати SerialVersionUID як private static final long змінну, щоб уникнути механізму за замовчуванням. Деякі IDE, такі як Eclipse , також видають попередження якщо ви забули це, наприклад: "Serialalizable class Customer does no declare a static final SerialVersionUID field of type long" ("Serializable-клас Customer не оголосив статичне фінальне поле SerialVersionUID типу long . Хоча ви і можете відключити це попередження слідуючи у Window > Preferences > Java > Compiler > Errors / Warnings > Potential Programming Problems, я пропоную не робити цього. Тільки коли відновлення даних не потрібно я можу бути недбалим у цьому. Ось як ця помилка виглядає в Eclipse IDE, все, що вам потрібно це прийняти перше швидке рішення. Навіщо використовувати SerialVersionUID всередині Serializable класу в Java - 2

  4. Ви також можете використовувати утиліту serialver з JDK для генерування Serial Version для класів Java. Утиліта також має GUI, який включається під час передачі параметра – show.

  5. Найкраща практика в серіалізації – це явно оголосити SerialVersionUID, щоб уникнути будь-яких проблем під час де-серіалізації, особливо якщо ви працюєте з клієнт-серверним додатком, який спирається на серіалізовані дані, наприклад, RMI.
Це все про SerialVersionUIDJava. Зараз ми знаємо чому важливо правильно оголошувати SerialVersionUIDу класі. Ви можете сказати спасибі вашій IDE за це нагадування, яке потенційно може порушити десеріалізацію вашого класу. Якщо ви хочете більше прочитати про серіалізацію та споріднені поняття, ви можете також переглянути ці дивовижні статті. Оригінал тут
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ