русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Долговременное хранение


Дата добавления: 2015-06-12; просмотров: 617; Нарушение авторских прав


Было бы замечательно привлечь технологию сериализации, чтобы сохранить состояние вашей программы для его последующего восстановления. Но перед тем как это делать, необходимо ответить на несколько вопросов. Что произойдет при сохранении двух объектов, содержащих ссылку на некоторый общий третий объект? Когда вы восстановите эти объекты, сколько экземпляров третьего объекта появится в программе? А если вы сохраните объекты в отдельных файлах, а затем десериализуете их в разных частях программы? Следующий пример демонстрирует возможные проблемы:

//: io/MyWorld.java

import java.io.*;

import java.util.*;

import static net.mindview.util.Print.*;

 

class House implements Serializable {}

 

class Animal implements Serializable {

private String name;

private House preferredHouse;

Animal(String nm, House h) {

name = nm;

preferredHouse = h;

}

public String toString() {

return name + "[" + super.toString() +

"], " + preferredHouse + "\n";

}

}

 

public class MyWorld {

public static void main(String[] args)

throws IOException, ClassNotFoundException {

House house = new House();

List<Animal> animals = new ArrayList<Animal>();

animals.add(new Animal("Bosco the dog", house));

animals.add(new Animal("Ralph the hamster", house));

animals.add(new Animal("Molly the cat", house));

print("animals: " + animals);

ByteArrayOutputStream buf1 =

new ByteArrayOutputStream();

ObjectOutputStream o1 = new ObjectOutputStream(buf1);

o1.writeObject(animals);

o1.writeObject(animals); // Write a 2nd set

// Write to a different stream:

ByteArrayOutputStream buf2 =

new ByteArrayOutputStream();

ObjectOutputStream o2 = new ObjectOutputStream(buf2);



o2.writeObject(animals);

// Now get them back:

ObjectInputStream in1 = new ObjectInputStream(

new ByteArrayInputStream(buf1.toByteArray()));

ObjectInputStream in2 = new ObjectInputStream(

new ByteArrayInputStream(buf2.toByteArray()));

List

animals1 = (List)in1.readObject(),

animals2 = (List)in1.readObject(),

animals3 = (List)in2.readObject();

print("animals1: " + animals1);

print("animals2: " + animals2);

print("animals3: " + animals3);

}

}

<spoiler text="Output:"> (Sample)

animals: [Bosco the dog[Animal@addbf1], House@42e816

, Ralph the hamster[Animal@9304b1], House@42e816

, Molly the cat[Animal@190d11], House@42e816

]

</spoiler> В этом примере стоит обратить внимание на использование механизма сериализации и байтового массива для «глубокого копирования» любого объекта с интерфейсом Serializable. (Глубокое копирование — создание дубликата всего графа объектов, а не просто основного объекта и его ссылок.)

Объекты Animal содержат поля типа House. В методе main() создается список ArrayList с несколькими объектами Animal, его дважды записывают в один поток и еще один раз — в отдельный поток. Когда эти списки восстанавливают и рас­печатывают, получается приведенный ранее результат (объекты при каждом запуске программы будут располагаться в различных областях памяти).

Конечно, нет ничего удивительного в том, что восстановленные объекты и их оригиналы будут иметь разные адреса. Но заметьте тот факт, что адреса в восстановленных объектах animals1 и animals2 совпадают, вплоть до повторения ссылок на объект House, общий для обоих списков. С другой стороны, при восстановлении списка animals3 система не имеет представления о том, что находящиеся в них объекты уже были восстановлены и имеются в программе, поэтому она создает совершенно иное семейство взаимосвязанных объектов. Если вы будете проводить сериализацию с использованием единого выходного потока, сохраненная сеть объектов гарантированно восстановится в первоначальном виде, без излишних повторений объектов. Конечно, записать объекты можно тогда, когда они еще не приняли окончательного состояния, но это уже на вашей совести — сохраненные объекты останутся в том состоянии, в котором вы их записали (с теми связями, что у них были на момент сериализации). Если уж необходимо зафиксировать состояние системы, безопаснее всего сделать это в рамках «атомарной» операции. Если вы сохраняете что-то, затем выполняете какие-то действия, снова сохраняете данные и т. д., у вас не получится безопасного хранилища состояния системы. Вместо этого следует поместить все объекты, являющиеся слагаемыми состояния системы в целом, в контейнер и сохранить этот контейнер единой операцией. Затем можно восстановить его вызовом одного метода.

Следующий пример — имитатор воображаемой системы автоматизированного проектирования (CAD), в котором используется такой подход. Вдобавок в нем продемонстрировано сохранение статических (static) нолей — если вы взглянете на документацию JDK, то увидите, что класс Class реализует интерфейс Serializable, поэтому для сохранения статических данных достаточно сохранить объект Class. Это достаточно разумное решение.

//: io/StoreCADState.java

// Сохранение состояния вымышленной системы CAD.

import java.io.*;

import java.util.*;

 

abstract class Shape implements Serializable {

public static final int RED = 1, BLUE = 2, GREEN = 3;

private int xPos, yPos, dimension;

private static Random rand = new Random(47);

private static int counter = 0;

public abstract void setColor(int newColor);

public abstract int getColor();

public Shape(int xVal, int yVal, int dim) {

xPos = xVal;

yPos = yVal;

dimension = dim;

}

public String toString() {

return getClass() +

"color[" + getColor() + "] xPos[" + xPos +

"] yPos[" + yPos + "] dim[" + dimension + "]\n";

}

public static Shape randomFactory() {

int xVal = rand.nextInt(100);

int yVal = rand.nextInt(100);

int dim = rand.nextInt(100);

switch(counter++ % 3) {

default:

case 0: return new Circle(xVal, yVal, dim);

case 1: return new Square(xVal, yVal, dim);

case 2: return new Line(xVal, yVal, dim);

}

}

}

 

class Circle extends Shape {

private static int color = RED;

public Circle(int xVal, int yVal, int dim) {

super(xVal, yVal, dim);

}

public void setColor(int newColor) { color = newColor; }

public int getColor() { return color; }

}

 

class Square extends Shape {

private static int color;

public Square(int xVal, int yVal, int dim) {

super(xVal, yVal, dim);

color = RED;

}

public void setColor(int newColor) { color = newColor; }

public int getColor() { return color; }

}

 

class Line extends Shape {

private static int color = RED;



<== предыдущая лекция | следующая лекция ==>
Альтернатива для Externalizable | Public static void


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.092 сек.