Программирование на JAVA
Меню :
Стартовая
Основы программирования
Программирование на JAVA
Программирование на C++
Программирование на Pascal
Задачи по программированию
Особого внимания требуют статические поля. Поскольку они принадлежат классу, а не объекту, они не участвуют в сериализации. При восстановлении объект будет работать с таким значением static-поля, которое уже установлено для его класса в этой JVM.
Граф сериализации
До этого мы рассматривали объекты, которые имеют поля лишь примитивных типов. Если же сериализуемый объект ссылается на другие объекты, их также необходимо сохранить (записать в поток байт), а при десериализации — восстановить. Эти объекты, в свою очередь, также могут ссылаться на следующие объекты. При этом важно, что если несколько ссылок указывают на один и тот же объект, то этот объект должен быть сериализован лишь однажды, а при восстановлении все ссылки должны вновь указывать на него одного. Например, сериализуемый объект А ссылается на объекты В и С, каждый из которых, в свою очередь, ссылается на один и тот же объект D. После десериализации не должно возникать ситуации, когда В ссылается на D1, а С - на D2, где D1 и D2 — равные, но все же различные объекты.
Курс
Лекция 15
Пакет java, io
Для организации такого процесса стандартный механизм сериали-зации строит граф, включающий в себя все участвующие объекты и ссылки между ними. Если очередная ссылка указывает на некоторый объект, сначала проверяется - нет ли такого объекта в графе. Если есть -объект второй раз не сериализуется. Если нет - новый объект добавляется в граф.
При построении графа может встретиться объект, порожденный от класса, не реализующего интерфейс 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.у = у;
}
public String toString() {
return "("+x+","+y+") reference-'+super.toString();
}
}
class Line implements Serializable { Point pointl; 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.pointl = p1; this.point2 = p2; this.index = index;
}
public int getlndex() {return index;}
public void setlndexfint newlndex) {index = newlndex;}