×
Traktatov.net » Философия Java » Читать онлайн
Страница 339 из 395 Настройки

}

} /* Output

[class Circlecolor[l] xPos[58] yPos[55] dim[93] . class Squarecolor[0] xPos[61] yPos[61] dim[29] . class Linecolor[3] xPos[68] yPos[0] dim[22] . class Circlecolor[l] xPos[7] yPos[88] dim[28] . class Squarecolor[0] xPos[51] yPos[89] dim[9] . class Linecolor[3] xPos[78] yPos[98] dim[61]

. class

, class

, class

, class

]

*/// ~

Мы видим, что значения переменных xPos, у Pos и dim сохранились и были успешно восстановлены, однако при восстановлении статической информации произошло что-то странное. При записи все статические поля color имели значение 3, но восстановление дало другие результаты. В окружностях значением стала единица (то есть константа RED), а в прямоугольниках поля color вообще равны нулю (помните, в этих объектах инициализация проходит в конструкторе). Похоже, статические поля вообще не сериализовались! Да, это именно так — хотя класс Class и реализует интерфейс Serializable, происходит это не так, как нам хотелось бы. Отсюда, если вам понадобится сохранить статические значения, делайте это самостоятельно.

Именно для этой цели предназначены методы serializeStaticState() и dese-rializeStaticState() класса Line. Вы можете видеть, как они вызываются в процессе сохранения и восстановления системы. (Заметьте, порядок действий при сохранении информации должен соблюдаться и при ее десериализации.) Поэтому для правильного выполнения этих программ необходимо сделать следующее:

1. Добавьте методы serializeStaticState() и deserializeStaticState() во все фигуры Shape.

2. Уберите из программы список shapeTypes и весь связанный с ним код.

3. При сериализации и восстановлении вызывайте новые методы для сохранения статической информации.

Также стоит позаботиться о безопасности, ведь сериализация сохраняет и закрытые (private) поля. Если в вашем объекте имеется конфиденциальная информация, ее необходимо пометить как transient. Но в таком случае придется подумать о безопасном способе хранения такой информации, ведь при восстановлении объекта необходимо восстанавливать все его данные.

Предпочтения

В пакете JDK 1.4 появился программный интерфейс API для работы с предпочтениями (preferences). Предпочтения гораздо более тесно связаны с долговременным хранением, чем механизм сериализации объектов, поскольку они позволяют автоматически сохранять и восстанавливать вашу информацию. Однако они применимы лишь к небольшим, ограниченным наборам данных — хранить в них можно только примитивы и строки, и длина строки не должна превышать 8 Кбайт (не так уж мало, но вряд ли подойдет для решения серьезных задач). Как и предполагает название нового API, предпочтения предназначены для хранения и получения информации о предпочтениях пользователя и конфигурации программы.

Circlecolor[l] xPos[20] yPos[58] dim[16] Squarecolor[0] xPos[40] yPos[ll] dim[22] Linecolor[3] xPos[4] yPos[83] dim[6] Circlecolor[l] xPos[75] yPos[10] dim[42]

Предпочтения представляют собой наборы пар «ключ-значение» (как в картах), образующих иерархию узлов. Хотя иерархия узлов и годится для построения сложных структур, чаще всего создают один узел, имя которого совпадает с именем класса, и хранят информацию в нем. Простой пример: