Государственный


Совместимость версий объекта при сериализации



бет17/25
Дата05.04.2024
өлшемі4.07 Mb.
#497748
1   ...   13   14   15   16   17   18   19   20   ...   25
Java. Потоки ввода-вывода. Работа с файлами. Кравчук А.С., Кравчук А.И., Кремень Е.В

Совместимость версий объекта при сериализации


Код программ часто меняется, особенно в процессе разработки. Не исключена такая ситуация, когда программист создал класс, затем создал его экземпляр и, сериализовав его, записал, например, в файл. Этот разложенный на байты объект какое-то время находился в файловой системе. Тем временем программист изменил код класса, например, добавил в него новое поле, а затем попытался прочесть объект класса из файла. В этом случае десериализация приведет к возникновению исключительной ситуации InvalidClassException.
Дело в том, среда выполнения сериализации связывает с каждым сериализуемым классом уникальный идентификатор версии, называемый serialVersionUID, который используется во время десериализации для проверки того, что отправитель и получатель сериализованного объекта загрузили классы для этого объекта, совместимые с сериализацией.
Уникальный идентификатор учитывает всю информацию о классе: число полей, порядок следования полей, их имена, тип полей,
модификаторы доступа включая поля вашего класса, интерфейсы, которые реализует класс, и даже различные реализации компилятора, а также методы их порядок следования. Любые изменения в классе или использование другого компилятора может привести к изменению SerialVersionUID, который в конечном итоге не позволит выполнить десериализацию данных.
Несмотря на то, что в механизме сериализации Java есть автоматическая неявная генерация SerialVersionUID, рекомендуется явно определять SerialVersionUID. Поскольку вычисление serialVersionUID «по умолчанию» основывается на сведениях о классе, которые могут различаться в зависимости от реализации компилятора, то использование собственного serialVersionUID позволит как минимум избежать зависимости от реализации компилятора.
Для явного определения программистом serialVersionUID в
Serializable-классе рекомендуется использовать конструкцию:

static final long serialVersionUID;


Также рекомендуется, чтобы в явных объявлениях


serialVersionUID использовался модификатор private.
Это единственный пример, когда static-поле сериализуется. При десериализации значение этого поля сравнивается с имеющимся у класса в виртуальной машине. Если значения не совпадают, генерируется исключение java.io.InvalidClassException.
Можно использовать утилиту, входящую в состав JDK, которая называется serialver, чтобы посмотреть какой код будет присвоен полю SerialVersionUID «по умолчанию» (это просто hash-код объекта «по умолчанию»). Существуют также специальные программы-генераторы UID (User identifier - идентификатор пользователя в операционной системе или на сайте). Можно самостоятельно присваивать значение и следить за его изменением при модификации класса.


Пример.



Достарыңызбен бөлісу:
1   ...   13   14   15   16   17   18   19   20   ...   25




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет