Вход/Регистрация
Программирование на 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. Так произошло потому, что объект, описывающий первую линию, уже был задействован в сериализации и, встретившись во второй раз, повторно записан не был.

  • Читать дальше
  • 1
  • ...
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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