Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
56_Java.pdf
Скачиваний:
210
Добавлен:
18.02.2016
Размер:
2.39 Mб
Скачать

Скачано с сайта http://ivc.clan.su

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

Имеется в виду, что когда содержимое объекта выводится в поток, в потоке сохраняются наборы байтов, представляющие и данный объект, и все другие объекты, на который тот ссылается и т.д. (графы могут быть многоуровневыми).

Сериализуемыми являются такие широко используемые классы Java как классы-оболочки простых типов; классы строк; классы исключений;

AWT-классы и многие другие.

Есть и несериализуемые классы (например, входные и выходные потоки данных, сетевые разъемы и пр.)

Схема сериализации объектов Java достаточно устойчива и распознаёт циклы, множественные ссылки, а также сериализует объект только один раз, даже если на этот объект имеется множество ссылок.

Тем не менее, могут возникнуть проблемы, если где-либо в графе есть ссылки на несериализуемый объект. В этом случае при попытке записать объект в поток будет сгенерировано исключение java.io.NotSerializableException. Большинство классов в пакетах Java имеет сериализуемые графы, если они реализуют интерфейс Serializable (за исключением классов-контейнеров, например

Hashtable и Vector).

Распространенная ошибка разработчиков Bean-компонентов заключается в том, что они забывают сделать сериализуемыми внутренние классы. Это препятствует сериализации не только внутреннего, но и внешнего класса, если он содержит ссылку на внутренний. Данная проблема особенно актуальна для Bean, содержащих один и более внутренних классовблоков прослушивания для обработки событий. (Об этом см. также в примере BeanlnstantiateDemo.java, демонстрирующем создание экземпляра сериализованного Bean.)

Ключевое слово transient (нестационарный) используется для идентификации поля в классе Java, которое не должно быть сериализовано. Обычно это поле, которое не описывает состояния объекта. Это может быть поле, которое изменяется при десериализации объекта (например: поле, сохраняющее время начала выполнения программы), или любое поле для временного хранения данных, используемое как внутренняя переменная.

Выполнение базовой сериализации

Сериализация управляется байтовыми потоками типа Object. Ими являются экземпляры

соответствующих классов в java.io: ObjectlnputStream и ObjectOutputStream. public class ObjectOutputStream extends OutputStream

implements ObjectOutput

public class ObjectlnputStream extends InputStream implements Objectlnput

Метод интерфейса java.io.ObjectOutput writeObject(), реализованный в классе ObjectOutputStream, обеспечивает сериализацию объектов. Если имеется ссылка oos на объект выходного потока ObjectOutputStream, то объект, подлежащий сериализации, передается этому методу, вызываемому для

объекта, в качестве параметра: oos.writeObject(x);

Здесь х - это ссылка на сериализуемый объект. Тип х не имеет значения. Объект может быть экземпляром любого класса, реализующего интерфейс java.io.Serializable.

Например:

FileOutputStream fos = newFileOutputStream("today.ser");

49

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]