Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
67
Добавлен:
08.06.2015
Размер:
837.63 Кб
Скачать

Сериализация объектов

Сериализация – процесс преобразования состояния объекта в бинарный формат (например, в файл или поток)

Десериализация – восстановление состояния объекта из бинарных данных

Не все объекты могут быть сериализованы

Класс должен быть подготовлен к сериализации

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