
- •Механизмы ввода и вывода
- •План лекции
- •Обмен данными
- •Традиционно, проблемы!
- •Потоки данных
- •Разновидности потоков
- •Структура пакета 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
- •Пример сериализации в файл
- •Пример десериализации из файла
- •Сравнение исходного и восстановленного объектов
- •Подготовка классов к сериализации
- •Порядок сериализации и десериализации
- •Пример иерархии классов
- •Результаты десериализации
- •Порядок сериализации
- •Порядок десериализации
- •Сериализация связанных объектов
- •Настройка сериализации
- •Настройка сериализации
- •Контроль версий
- •Спасибо за внимание!
- •Дополнительные источники

Сериализация объектов
Сериализация – процесс преобразования состояния объекта в бинарный формат (например, в файл или поток)
Десериализация – восстановление состояния объекта из бинарных данных
Не все объекты могут быть сериализованы
Класс должен быть подготовлен к сериализации
41

Сериализация объектов
Сериализованный объект можно сохранить в файл или передать по сети
После передачи объект можно восстановить, то есть десериализовать
Сериализацию и десериализацию можно производить в разных JVM
Широкое применение сериализации при создании распределенных приложений
42

Группа байтовых потоков Object
Класс ObjectOutputStream реализует сериализацию
Класс ObjectInputStream реализует десериализацию
Классы позволяют выводить и вводить графы объектов с сохранением структуры
Результатом десериализации является объект, равнозначный исходному
43

Пример сериализации в файл
import java.io.*;
public class SerializationWrite {
public static void main(String[] args) { int[] values = {1, 2, 3, 4, 5};
try {
ObjectOutputStream out = new
ObjectOutputStream(new
FileOutputStream("out.bin"));
out.writeObject(values);
out.close();
}
catch(IOException e) {
System.out.println("Some error occurred!");
}
}
}
out.bin Текстовая форма
┐н♣ur☻
[IМє`&vк__☻
xp ♣ ☺ ☻
♥♦ ♣
out.bin Байтовая форма
AC ED 00 05 75 72
00 02 5B 49 4D BA
60 26 76 EA B2 A5
02 00 00 78 70 00
00 00 05 00 00 00
01 00 00 00 02 00
00 00 03 00 00 00
04 00 00 00 05
44

Пример десериализации из файла
import java.io.*;
public class SerializationRead {
public static void main(String[] args) { int[] values;
try {
ObjectInputStream in = new ObjectInputStream(new
FileInputStream("out.bin")); values = (int[])in.readObject(); in.close();
}
catch(IOException e) { System.out.println("Some error occurred!");
}
catch(ClassNotFoundException e) { System.out.println("Wrong object type");
}
}
}
45

Сравнение исходного и восстановленного объектов
При сравнении методом equals состояний исходного и десериализованного объектов
ожидается значение true
System.out.println(objSave.equals(objRead));
При непосредственном сравнении ссылок объектов оператором == результат будет равен значению false
System.out.println(objSave == objRead);
46

Подготовка классов к сериализации
Должен реализовываться интерфейс-маркер java.io.Serializable
Все сериализуемые поля должны иметь сериализуемый тип
Родительский класс должен иметь конструктор по умолчанию (без параметров) или быть подготовленным к сериализации
Сериализуются поля объекта, не обозначенные как transient или static
47

Порядок сериализации и десериализации
В нисходящем порядке по древовидной иерархии типов: от первого сериализуемого класса до частного типа
Объекты, на которые ссылаются поля, сериализуются в порядке обнаружения
Перед десериализацией выполняется загрузка участвующих классов (возможен выброс исключения ClassNotFoundException)
48

Пример иерархии классов
class Class1 extends Object { private int state1 = 1;
public int getState1() { return state1; }
public void setState1(int s1) { this.state1 = s1; }
}
class Class2 extends Class1 implements Serializable { protected int state21 = 21;
private int state22 = -1;
public int getState22() { return state22; } public void setState22(int s22) { this.state22 =
s22; }
}
class Class3 extends Class2 { public int state3 = 3;
}
49

Результаты десериализации
FileOutputStream fos = new FileOutputStream("output.bin");
ObjectOutputStream oos = new ObjectOutputStream(fos);
Class3 c3 = new Class3(); c3.setState1(2); c3.setState22(22); oos.writeObject(c3);
FileInputStream fis = new FileInputStream("output.bin");
ObjectInputStream ois = new ObjectInputStream(fis); Class3 c3Read = (Class3) ois.readObject();
System.out.println("state3: " + c3Read.state3); System.out.println("state21: " + c3Read.state21);
System.out.println("state22: " + c3Read.getState22());
System.out.println("state1: " + c3Read.getState1());
state3: 3 state21: 21 state22: 22 state1: 1
50