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

0

 

   Необходимым условием возможности осуществления сериализации объектов класса средствами потока ObjectOutputStream является реализация классом интерфейса-лшркера (marker interface, см. раздел 4.5) Serializable. Поддержка классом интерфейса Serializable свидетельствует о том, что объекты класса готовы к сериализации.

   Критерии способности класса к сериализации могут быть достаточно простыми. По умолчанию процесс сериализации заключается в сериализации каждого поля объекта, которое не обозначено как transient или static. Данные простых типов и строки сохраняются с помощью того же механизма, какой поддерживается потоками DataOutputStream, а сериализация объектов выполняется средствами метода writeObject. Схема сериализации, предусмотренная по умолчанию, предполагает, что все поля-объекты, подлежащие сериализации, должны указывать на типы, в свою очередь поддерживающие возможность сериализации. Кроме того, требуется, чтобы класс, базовый по отношению к рассматриваемому, либо обладал конструктором без параметров (дабы таковой мог быть вызван в процессе десериализации), либо сам в свою очередь обеспечивал реализацию интерфейса Serializable (в таком случае реализация того же интерфейса в производном классе будет избыточным, хотя и безобидным решением). В большинстве ситуаций для обеспечения возможности сериализации объектов класса вполне достаточно тех мер, которые предусмотрены схемой сериализации, предлагаемой по умолчанию, и проблема исчерпывается простым упоминанием интерфейса Serializable в объявлении класса:

 

public class Name implements Java.io.serializable {

private string name;

private long id;

private transient boolean hashset = false;

private transient int hash;

 

private static long nextiD = 0;

 

    public Name(string name)   {

            this.name = name;

           synchronized  (Name.class)   {

                 id = nextlD++;

   }

}

public int hashCode()   {

    if (!hashset)   {

hash = name.hashCode();

   hashset = true;

 }

 return hash;

}

//   . ..   переопределить equals и добавить другие полезные методы

  Объект класса Name может быть сохранен в потоке ObjectOutputStream и непосредственно, с помощью вызова метода writeObject, и косвенно, если этот объект адресуется из другого объекта, подлежащего сериализации. Содержимое полей name и id выводится в поток; поля nextiD, hashSet и hash, однако, в процесс сериализации вовлечены не будут, поскольку nextID объявлено как static, а два других поля обозначены модификатором transient. Так как поле hash содержит хеш-код, который может быть заново пересчитан на основании содержимого name, нет никаких причин расходовать на его сериализацию дополнительные вычислительные ресурсы и время.

  Схема десериализации, предлагаемая по умолчанию, предусматривает считывание из потока байтовых данных, сохраненных в процессе сериализации. Статические поля класса остаются в неприкосновенности — в ходе загрузки класса будут выполнены все обычные процедуры инициализации, и статические поля получат требуемые исходные значения. Каждому полю transient в восстановленном объекте присваивается значение по умолчанию, соответствующее типу этого поля. При десериализации объекта класса Name полям name и id вновь созданного объекта будут присвоены те же значения, что и в исходном объекте, содержимое статического поля nextID останется нетронутым, а transient-поля hashSet и hash получат соответствующие значения по умолчанию (false и 0)— если значение hashSet равно raise, величина hash будет пересчитана заново.

  Иногда встречаются классы, которые сами по себе допускают возможность сериализации, но их отдельные элементы — нет. Например, контейнерный класс как таковой, позволяющий сериализацию, может содержать ссылки на объекты, Которые сериализации не поддаются. Любая попытка осуществления сериализа-Ции объекта, не поддерживающего эту возможность, приводит к выбрасыванию исключения типа NotSerial izableException.

 

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

По теме:

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