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

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

Жанры

Философия Java3

Эккель Брюс

Шрифт:

// 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 toStringO {

return name + "[" + super.toString + "], " + preferredHouse + "\n",

public class MyWorld {

public static void main(String[] args) throws IOException, ClassNotFoundException { House house = new HouseO: 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)): printC'animals " + animals), ByteArrayOutputStream bufl =

new ByteArrayOutputStream. ObjectOutputStream ol = new ObjectOutputStream(bufl). ol.writeObject(animals):

01 writeObject(animals). //

Записываем второй набор // Запись в другой поток ByteArrayOutputStream buf2 =

new ByteArrayOutputStream; ObjectOutputStream o2 = new 0bject0utputStream(buf2):

02 writeObject(animals).

// Теперь восстанавливаем записанные объекты ObjectlnputStream inl = new ObjectInputStream(

new ByteArrayInputStream(bufl toByteArrayO)). ObjectlnputStream in2 = new ObjectInputStream(

new ByteArrayInputStream(buf2 toByteArrayO));

List

animalsl = (List)inl readObjectO, animals2 = (List)inl readObjectO, ammals3 = (List)in2 readObjectO, printC'animalsl " + animalsl); pnnt("animals2. " + animals2); print("animals3 " + animals3).

}

} /* Output (Sample)

animals- [Bosco the dog[Animal@addbfl]. House@42e816 . Ralph the hamster[Animal@9304bl]. House@42e816

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

animalsl [Bosco the dog[Animal@de6f34]. House@156ee8e . Ralph the hamster[Animal@47b480]. House@156ee8e

, Molly the cat[Animal@19b49e6], House@156ee8e ]

animals2 [Bosco the dog[Animal@de6f34], House@156ee8e , Ralph the hamster[Animal@47b480]. House@156ee8e

. Molly the cat[Animal@19b49e6], House@156ee8e ]

animals3 [Bosco the dog[Animal@10d448], House@e0elc6 , Ralph the hamster[Animal@6calc], House@e0elc6

. Molly the cat[Animal@lbf216a]. House@e0elc6 ]

*/// ~

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

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

Конечно, нет ничего удивительного в том, что восстановленные объекты и их оригиналы будут иметь разные адреса.

Но заметьте тот факт, что адреса в восстановленных объектах animalsl и animals2 совпадают, вплоть до повторения ссылок на объект House, общий для обоих списков. С другой стороны, при восстановлении списка animals3 система не имеет представления о том, что находящиеся в них объекты уже были восстановлены и имеются в программе, поэтому она создает совершенно иное семейство взаимосвязанных объектов.

Если вы будете проводить сериализацию с использованием единого выходного потока, сохраненная сеть объектов гарантированно восстановится в первоначальном виде, без излишних повторений объектов. Конечно, записать объекты можно тогда, когда они еще не приняли окончательного состояния, но это уже на вашей совести — сохраненные объекты останутся в том состоянии, в котором вы их записали (с теми связями, что у них были на момент сериализации).

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

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

//• i o/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 getColorO; public Shape(int xVal. int yVal, int dim) { xPos = xVal; yPos = yVal; dimension = dim;

}

public String toStringO { return getClassO +

"color[" + getColorO + "] xPos[" + xPos + "] yPos[" + yPos + "] dim[" + dimension + "]\n";

}

public static Shape randomFactory { int xVal = rand.nextlnt(lOO); int yVal = rand.nextlnt(lOO); int dim = rand.nextlnt(lOO); switch(counter++ % 3) { default:

case 0: return new Circle(xVal. yVal. dim); case 1: return new Square(xVal. yVal, dim); case 2: return new LineCxVal. yVal. dim);

}

class Circle extends Shape {

private static int color = RED;

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

Как я строил магическую империю 4

Зубов Константин
4. Как я строил магическую империю
Фантастика:
боевая фантастика
постапокалипсис
аниме
фантастика: прочее
фэнтези
5.00
рейтинг книги
Как я строил магическую империю 4

Безумный Макс. Поручик Империи

Ланцов Михаил Алексеевич
1. Безумный Макс
Фантастика:
героическая фантастика
альтернативная история
7.64
рейтинг книги
Безумный Макс. Поручик Империи

Попаданка 3

Ахминеева Нина
3. Двойная звезда
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Попаданка 3

Муж на сдачу

Зика Натаэль
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Муж на сдачу

Призыватель нулевого ранга. Том 3

Дубов Дмитрий
3. Эпоха Гардара
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Призыватель нулевого ранга. Том 3

На границе империй. Том 10. Часть 5

INDIGO
23. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 5

Адвокат

Константинов Андрей Дмитриевич
1. Бандитский Петербург
Детективы:
боевики
8.00
рейтинг книги
Адвокат

На границе империй. Том 7

INDIGO
7. Фортуна дама переменчивая
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
6.75
рейтинг книги
На границе империй. Том 7

Здравствуй, 1985-й

Иванов Дмитрий
2. Девяностые
Фантастика:
альтернативная история
5.25
рейтинг книги
Здравствуй, 1985-й

О, Путник!

Арбеков Александр Анатольевич
1. Квинтет. Миры
Фантастика:
социально-философская фантастика
5.00
рейтинг книги
О, Путник!

Чужбина

Седой Василий
2. Дворянская кровь
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чужбина

Бестужев. Служба Государевой Безопасности. Книга четвертая

Измайлов Сергей
4. Граф Бестужев
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бестужев. Служба Государевой Безопасности. Книга четвертая

Локки 5. Потомок бога

Решетов Евгений Валерьевич
5. Локки
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Локки 5. Потомок бога

На границе империй. Том 10. Часть 4

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