
- •Механизмы ввода и вывода
- •План лекции
- •Обмен данными
- •Традиционно, проблемы!
- •Потоки данных
- •Разновидности потоков
- •Структура пакета java.io
- •Разновидности потоков
- •Класс InputStream
- •Класс OutputStream
- •Класс Reader
- •Класс Writer
- •Классы потоков ввода и вывода
- •Иерархия байтовых потоков
- •Иерархия символьных потоков
- •Забавная особенность
- •Группа потоков Print
- •Группа байтовых потоков ByteArray
- •Группа байтовых потоков ByteArray
- •Группы символьных потоков CharArray и String
- •Группа потоков File
- •Классы-трансляторы
- •InputStreamReader и
- •Группа потоков Filter
- •Группа потоков Buffered
- •Группа потоков Buffered
- •Группа потоков Piped
- •Группа потоков Piped
- •Класс StreamTokenizer
- •Класс StreamTokenizer
- •Группа байтовых потоков Data
- •Группа байтовых потоков Data
- •Класс File
- •Класс File
- •Пример записи в текстовый файл
- •Пример чтения из текстового файла и из консоли
- •Пример записи в байтовый файл
- •Пример чтения из байтового файла
- •Соответствие классов для байтовых и символьных потоков
- •Соответствие классов для байтовых и символьных потоков
- •Сериализация объектов
- •Сериализация объектов
- •Группа байтовых потоков Object
- •Пример сериализации в файл
- •Пример десериализации из файла
- •Сравнение исходного и восстановленного объектов
- •Подготовка классов к сериализации
- •Порядок сериализации и десериализации
- •Пример иерархии классов
- •Результаты десериализации
- •Порядок сериализации
- •Порядок десериализации
- •Сериализация связанных объектов
- •Настройка сериализации
- •Настройка сериализации
- •Контроль версий
- •Спасибо за внимание!
- •Дополнительные источники

Порядок сериализации
Object |
|
Class3 |
state3 |
|
|
||
|
|
Class2 |
state21 |
Class1 |
Serializable |
|
|
|
state22 |
||
|
|
|
|
Class2 |
|
Class1 |
state1 |
|
|
||
|
|
Object |
|
Class3 |
|
|
|
Сериализованное состояние объекта класса Class3
Class3: (Class2) state21 state22 (Class3) state3
51

Порядок десериализации
Object |
|
Class3 |
state3 |
|
|
||
|
|
Class2 |
state21 |
Class1 |
Serializable |
|
|
|
state22 |
||
|
|
|
|
Class2 |
|
Class1 |
state1 |
|
|
||
|
|
Object |
|
Class3 |
|
|
|
Сериализованное состояние объекта класса Class3
Class3: (Class2) state21 state22 (Class3) state3
52

Сериализация связанных объектов
Если сериализуемый объект ссылается на другие объекты, их необходимо сохранять
Строится граф сериализации, включающий все связанные объекты
Нескольким ссылкам на один объект соответствует только один объект графа
Если встречен несериализуемый объект,
генерируется NotSerializableException
53

Настройка сериализации
Для изменения работы механизма сериализации на уровне вашего класса в нем надо описать методы:
реализация сериализации
private void writeObject(ObjectOutputStream out) throws IOException
реализация десериализации
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
Уровень доступа методов позволяет им независимо работать в разных классах в иерархиях наследования
Можно не переписывать чтение/запись полностью, а лишь изменить порядок записи полей и их формат
(методы ObjectOutputStream.writeFields() и
ObjectInputStream.readFields())
54

Настройка сериализации
public class ExampleClass implements Serializable { public transient int var1 = 111;
private static final ObjectStreamField[] serialPersistentFields = {
new ObjectStreamField("var1", Integer.TYPE)
};
private void readObject(ObjectInputStream in)
throws IOException, ClassNotFoundException
{
ObjectInputStream.GetField fields = in.readFields();
//magic!!!
var1 = fields.get("var1", 0);
}
private void writeObject(ObjectOutputStream out) throws IOException {
ObjectOutputStream.PutField fields = out.putFields(); //magic!!!
fields.put("var1", var1); out.writeFields();

Контроль версий
Каждый класс имеет уникальный идентификатор номера версии – 64 битовое значение long
По умолчанию значение рассчитывается как функция от кода класса (включая методы)
Несовпадение версий при десериализации объекта выбрасывает исключение
InvalidClassException
Схему можно обойти, явно введя в класс поле
private static final long serialVersionUID = ...;
56

Спасибо за внимание!

Дополнительные источники
Арнолд, К. Язык программирования Java [Текст] / Кен Арнолд, Джеймс Гослинг, Дэвид Холмс. – М. : Издательский дом «Вильямс», 2001. – 624 с.
Вязовик, Н.А. Программирование на Java. Курс лекций [Текст] / Н.А. Вязовик. – М. : Интернет-университет информационных технологий, 2003. – 592 с.
Хорстманн, К. Java 2. Библиотека профессионала. Том 1. Основы [Текст] / Кей Хорстманн, Гари Корнелл. – М. : Издательский дом «Вильямс», 2010 г. – 816 с.
Эккель, Б. Философия Java [Текст] / Брюс Эккель. – СПб. : Питер, 2011. – 640 с.
JavaSE at a Glance [Электронный ресурс]. – Режим доступа: http://www.oracle.com/technetwork/java/javase/overview/index.html, дата доступа: 21.10.2011.
JavaSE APIs & Documentation [Электронный ресурс]. – Режим доступа: http://www.oracle.com/technetwork/java/javase/documentation/api-jsp-136079.html, дата доступа: 21.10.2011.