Чтение онлайн

на главную - закладки

Жанры

Программирование на Java

Вязовик Н.А.

Шрифт:

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

При построении графа может встретиться объект, порожденный от класса, не реализующего интерфейс Serializable. В этом случае сериализация прерывается, генерируется исключение java.io.NotSerializableException.

Рассмотрим

пример:

import java.io.;

class Point implements Serializable {

double x;

double y;

public Point(double x, double y) {

this.x = x;

this.y = y;

}

public String toString {

return "("+x+","+y+") reference="+super.toString;

}

}

class Line implements Serializable {

Point point1;

Point point2;

int index;

public Line {

System.out.println("Constructing empty line");

}

Line(Point p1, Point p2, int index) {

System.out.println("Constructing line: " + index);

this.point1 = p1;

this.point2 = p2;

this.index = index;

}

public int getIndex {

return index;

}

public void setIndex(int newIndex) {

index = newIndex;

}

public void printInfo {

System.out.println("Line: " + index);

System.out.println(" Object reference: " + super.toString);

System.out.println(" from point "+point1);

System.out.println(" to point "+point2);

}

}

public class Main {

public static void main(java.lang.String[] args) {

Point p1 = new Point(1.0,1.0);

Point p2 = new Point(2.0,2.0);

Point p3 = new Point(3.0,3.0);

Line line1 = new Line(p1,p2,1);

Line line2 = new Line(p2,p3,2);

System.out.println("line 1 = " + line1);

System.out.println("line 2 = " + line2);

String fileName = "d:\\file"; try {

// записываем объекты в файл

FileOutputStream os = new FileOutputStream(fileName);

ObjectOutputStream oos = new ObjectOutputStream(os);

oos.writeObject(line1);

oos.writeObject(line2);

// меняем состояние line1 и записываем его еще раз

line1.setIndex(3);

//oos.reset;

oos.writeObject(line1);

// закрываем потоки

// достаточно закрыть только поток-надстройку oos.close;

// считываем объекты System.out.println("Read objects:");

FileInputStream is = new FileInputStream(fileName);

ObjectInputStream ois = new ObjectInputStream(is);

for (int i=0; i<3; i++) {

// Считываем 3 объекта

Line line = (Line)ois.readObject;

line.printInfo;

}

ois.close;

}

catch(ClassNotFoundException e) {

e.printStackTrace;

}

catch(IOException e) {

e.printStackTrace;

}

}

}

Пример 15.12.

В этой программе

работа идет с классом Line (линия), который имеет 2 поля типа Point (линия описывается двумя точками). Запускаемый класс Main создает два объекта класса Line, причем, одна из точек у них общая. Кроме этого, линия имеет номер (поле index ). Созданные линии (номера 1 и 2) записываются в поток, после чего одна из них получает новый номер (3) и вновь сериализуется.

Выполнение этой программы приведет к выводу на экран примерно следующего:

Constructing line: 1

Constructing line: 2

line 1 = Line@7d39

line 2 = Line@4ec

Read objects:

Line: 1

Object reference: Line@331e

from point (1.0,1.0) reference=Point@36bb

to point (2.0,2.0) reference=Point@386e

Line: 2

Object reference: Line@6706

from point (2.0,2.0) reference=Point@386e

to point (3.0,3.0) reference=Point@68ae

Line: 1

Object reference: Line@331e

from point (1.0,1.0) reference=Point@36bb

to point (2.0,2.0) reference=Point@386e

Пример 15.13.

Из примера видно, что после восстановления у линий сохраняется общая точка, описываемая одним и тем же объектом (хеш-код 386e ).

Третий записанный объект идентичен первому, причем, совпадают даже объектные ссылки. Несмотря на то, что при записи третьего объекта значение index было изменено на 3, в десериализованном объекте оно осталось равным 1. Так произошло потому, что объект, описывающий первую линию, уже был задействован в сериализации и, встретившись во второй раз, повторно записан не был.

Чтобы указать, что сеанс сериализации завершен, и получить возможность передавать измененные объекты, у ObjectOutputStream нужно вызвать метод reset. В рассматриваемом примере для этого достаточно убрать комментарий в строке

//oos.reset;

Если теперь запустить программу, то можно увидеть, что третий объект получит номер 3.

Constructing line: 1

Constructing line: 2

line 1 = Line@ea2dfe

line 2 = Line@7182c1

Read objects:

Line: 1

Object reference: Line@a981ca

from point (1.0,1.0) reference=Point@1503a3

to point (2.0,2.0) reference=Point@a1c887

Line: 2

Object reference: Line@743399

from point (2.0,2.0) reference=Point@a1c887

to point (3.0,3.0) reference=Point@e7b241

Line: 3

Object reference: Line@67d940

from point (1.0,1.0) reference=Point@e83912

to point (2.0,2.0) reference=Point@fae3c6

Пример 15.14.

Однако это будет уже новый объект, ссылка на который отличается от первой считанной линии. Более того, обе точки будут также описываться новыми объектами. То есть в новом сеансе все объекты были записаны, а затем восстановлены заново.

Поделиться:
Популярные книги

Третий. Том 4

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий. Том 4

#Бояръ-Аниме. Газлайтер. Том 13

Володин Григорий Григорьевич
13. История Телепата
Фантастика:
боевая фантастика
аниме
попаданцы
фэнтези
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 13

Мусорщик

Поселягин Владимир Геннадьевич
3. Наемник
Фантастика:
боевая фантастика
космическая фантастика
8.55
рейтинг книги
Мусорщик

Сам себе властелин

Горбов Александр Михайлович
Фантастика:
фэнтези
юмористическая фантастика
7.00
рейтинг книги
Сам себе властелин

Идеальный мир для Лекаря 6

Сапфир Олег
6. Лекарь
Фантастика:
фэнтези
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 6

Кодекс Крови. Книга ХIV

Борзых М.
14. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Крови. Книга ХIV

Император Пограничья 3

Астахов Евгений Евгеньевич
3. Император Пограничья
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Император Пограничья 3

Запечатанный во тьме. Том 1. Тысячи лет кача

NikL
1. Хроники Арнея
Фантастика:
уся
эпическая фантастика
фэнтези
5.00
рейтинг книги
Запечатанный во тьме. Том 1. Тысячи лет кача

Кодекс Охотника. Книга XIII

Винокуров Юрий
13. Кодекс Охотника
Фантастика:
боевая фантастика
попаданцы
аниме
7.50
рейтинг книги
Кодекс Охотника. Книга XIII

С Д. Том 16

Клеванский Кирилл Сергеевич
16. Сердце дракона
Фантастика:
боевая фантастика
6.94
рейтинг книги
С Д. Том 16

Идеальный мир для Лекаря 25

Сапфир Олег
25. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 25

Эммануэль

Арсан Эммануэль
1. Эммануэль
Любовные романы:
эро литература
7.38
рейтинг книги
Эммануэль

Найденыш

Шмаков Алексей Семенович
2. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
5.00
рейтинг книги
Найденыш

Великий род

Сай Ярослав
3. Медорфенов
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Великий род