JavaRush /جاوا بلاگ /Random-UR /Зачем использовать SerialVersionUID внутри Serializable к...
0xFF
سطح
Донецк

Зачем использовать SerialVersionUID внутри Serializable класса в Java

گروپ میں شائع ہوا۔
Serialization и SerialVersionUID всегда остается загадкой для многих Java-разработчиков. Я часто вижу вопросы насчет того что такое SerialVersionUID, or что произойдет, если я не объявлю SerialVersionUID в моем Serializable-классе? Зачем использовать SerialVersionUID внутри Serializable класса в Java - 1Помимо запутанного и редкого использования, есть еще одна причина для этого вопроса — это предупреждение Eclipse IDE об отсутствии SerialVersionUID, например: "The Serializable class Customer does not declare a static final SerialVersionUID field of type long" ("Serializable-класс Customer не объявил статическое финальное поле SerialVersionUID типа long"). В этой статье, вы сможете не только узнать основы Java SerialVersionUID но и его влияние на процесс сериализации и де-сериализации. Когда вы объявляете класс, How Serializable путем реализации интерфейса-маркера java.io.Serializable, среда выполнения Java сохраняет экземпляр этого класса на диске с помощью механизма сериализации по умолчанию, если вы не настроor процесс использования интерфейса Externalizable. Во время сериализации, среда выполнения Java создает номер версии для класса, так что она может десереализировать его позже. В Java этот номер версии известен How SerialVersionUID. Если во время десериализации, SerialVersionUID не соответствует, то процесс завершится с исключением InvalidClassException в потоке "main" java.io.InvalidClassException, а также напечатает Name класса и соответствующий SerialVersionUID. Быстрое решение для исправления этой проблемы – скопировать SerialVersionUID и определить его How константу типа private static final long в вашем классе. В этой статье мы узнаем, о том, почему мы должны использовать SerialVersionUID в Java и How использовать инструмент serialver JDK для генерации этого ID. Если вы новичок в сериализации, вы также можете посмотреть Топ 10 вопросов о сериализации Java на интервью чтобы оценить свои знания и найти пробелы в вашем понимании для дальнейшего чтения. Подобно Concurrency (параллельности) и Multi-threading (многопоточности), Serialization (сериализация) это уже другая тема, которая заслуживает чтения несколько раз.

Зачем использовать SerialVersionUID в Java

Как я сказал, когда мы не определorли meaning SerialVersionUID How static final long в нашем классе, механизм сериализации сделает это за нас. Этот механизм чувствителен ко многим деталям, включая поля вашего класса, их модификаторы доступа, интерфейсы, которые он реализует и даже различные реализации компилятора, любые изменения в классе or использование другого компилятора может дать результат иного 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 для старых классов. Это очень полезно в случае, если вы внесли изменения в ваш класс, который нарушает сериализацию и ваше приложение не может перезагрузить сериализированные экземпляры. Вы легко можете использовать эту утorту для создания SerialVersionUID для старых экземпляров, а затем использовать его в явном виде объявив поле How private static final long SerialVersionUID. Кстати, очень рекомендуется из соображений производительности и безопасности использовать обычный двоичный формат для сериализации, опять же “Effective Java” имеет несколько параграфов, которые демонстрируют преимущества обычного формата в мельчайших деталях.

Как использовать утorту serialver JDK для генерирования SerialVersionUID

Вы можете использовать serialver для генерирования SerialVersionUID для классов. Это особенно полезно для развивающихся классов, утorта возвращает SerialVersionUID в формате легком для копирования. Вы можете использовать утorту serialver JDK How показано в примере:

$ serialver
use: serialver [-classpath classpath] [-show] [classname...]
$ serialver -classpath . Hello
Class Hello is not Serializable.
$ serialver -classpath . Hello
Hello: static final long SerialVersionUID = -4862926644813433707L;
Вы также можете использовать утorту serialver в GUI виде используя команду $ serialver –show, это откроет инспектор serial version, который принимает полное Name класса и показывает его Serial version.

Резюме

Теперь мы знаем что такое SerialVersionUID и почему важно объявлять его в Serializable-классе, самое время пересмотреть некоторые важные факты связанные с Java SerialVersionUID.
  1. SerialVersionUID используется для указании версии сериализованных данных.

  2. Когда мы не объявляем SerialVersionUID в нашем классе, среда выполнения Java делает это за нас, но этот процесс чувствителен ко многим метаданным класса включая количество полей, тип полей, модификаторы доступа полей, интерфейсов, которые реализованы в классе и пр. Вы можете найти точную информацию в documentации о сериализации от Oracle.

  3. Рекомендуется объявлять SerialVersionUID How private static final long переменную во избежание механизма по умолчанию. Некоторые IDE, такие How Eclipse, также выдают предупреждения если вы забыли это, например: "The Serializable class Customer does not declare a static final SerialVersionUID field of type long" ("Serializable-класс Customer не объявил статическое финальное поле SerialVersionUID типа long"). Хотя вы и можете отключить это предупреждение следуя в Window > Preferences > Java > Compiler > Errors / Warnings > Potential Programming Problems, я предлагаю не делать этого. Только когда восстановление данных не требуется я могу быть небрежным в этом. Вот How эта ошибка выглядит в Eclipse IDE, все что вам нужно это принять первое быстрое решение. Зачем использовать SerialVersionUID внутри Serializable класса в Java - 2

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

  5. Лучшая практика в сериализации – это явно объявить SerialVersionUID, чтобы избежать любых проблем при де-сериализации, особенно если вы работаете с клиент-serverным приложением, которое опирается на сериализованные данные, например, RMI.
Это все про SerialVersionUID в Java. Now мы знаем почему важно правильно объявлять SerialVersionUID в классе. Вы можете сказать спасибо вашей IDE за это напоминание, которое потенциально может нарушить де-сериализацию вашего класса. Если вы хотите больше прочитать про сериализацию и родственные понятия, вы можете также посмотреть эти удивительные статьи. Оригинал здесь
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION