Главная » Java » Порядок сериализации и десериализации в Java

0

 

  Каждый класс несет ответственность за обеспечение надлежащей сериализации состояния собственных объектов, т.е. содержимого их полей. Сериализация и десе-

риализация объектов выполняется в нисходящем порядке по древовидной иерархии типов— от первого из классов, поддерживающих интерфейс Serializable, До классов более частных типов. Указанный порядок редко играет весомую роль ппи сериализации, но приобретает существенное значение в процессе десериализации Рассмотрим следующую иерархию типов, которой подчиняется класс HTTPInput.

      При десериализации объекта HTTPInput поток ObjectlnputStream вначале выделяет память для нового объекта, а затем находит в иерархии типов ближайший из классов, поддерживающий интерфейс Serializable, — в нашем случае — URLInput. Далее поток вызывает конструктор без параметров для класса, базового по отношению к найденному (ближайшего из числа тех, которые не поддерживают интерфейс Serializable)— в данном случае, InputSource. Если должно быть сохранено иное состояние части объекта, относящейся к базовому классу (InputSource), ответственность за сериализацию и десериализацию этого состояния возлагается на URLInput. Если же базовый класс, не обеспечивающий сериализацию, обладает собственным значимым состоянием, вам почти наверняка придется отступить от схемы сериализации, предлагаемой по умолчанию, и осуществить дополнительную настройку ближайшего из классов, поддерживающих механизм сериализации (см. следующий раздел). Если такой класс непосредственно наследует класс Object (как было в ситуации с классом Name, рассмотренным выше), процедура настройки окажется простой, поскольку Object не обладает каким-либо особым состоянием, подлежащим сохранению и последующему восстановлению.

   Как только ближайший из классов, поддерживающих механизм сериализации, завершает восстановление данных того подмножества полей, которые относятся к базовому классу, он приступает к воссозданию своего собственного состояния, считывая данные из потока. Затем поток ObjectlnputStream осуществляет просмотр иерархии объектов в нисходящем порядке и выполняет десериализацию каждого объекта посредством вызовов readObject. По достижении нижнего уровня дерева иерархии процесс десериализации исходного объекта полностью завершается.

   В ходе десериализации объекта могут быть найдены ссылки на другие ранее сериализованные объекты. Эти объекты подвергаются десериализации в том порядке, в каком они обнаруживаются. Так, если бы объект URLInput, скажем, обладал ссылкой на объект HashMap, адресуемая хеш-таблица вместе со всем ее содержимым была бы подвергнута десериализации раньше, чем оставшаяся часть объекта URLInput как такового.

   Прежде чем будут выполнены любые из рассмотренных операций десериализации, соответствующие классы должны быть загружены. В процессе загрузки выполняется поиск класса с требуемым именем и проверка версии этого класса (см. раздел 15.7.5). Если подлинность и соответствие версии класса установлены, тот должен быть загружен. Если же класс не найден либо не может быть загружен по иным причинам, метод  readObject выбрасывает исключение типа ClassNotFoundException.

 

Источник: Арнолд, Кен, Гослинг, Джеймс, Холмс, Дэвид. Язык программирования Java. 3-е изд .. : Пер. с англ. – М. : Издательский дом «Вильяме», 2001. – 624 с. : ил. – Парал. тит. англ.

По теме:

  • Комментарии