12.6 Выводы |
Предыдущая Содержание Следующая |
Объекты называются постоянными (персистентными), если они могут быть сохранены в файлах, чтобы быть загруженными позже тем же или другим приложением. Постоянные объекты могут сохраняться или явными действиями, или неявно во время разрушения. Загрузка требует выделения памяти и конструирования. Реализация постоянности требует двух динамически компонуемых метода и функции управления процессом загрузки:
int puto (const _self, FILE * fp); void * geto (_self, FILE * fp); void * retrieve (FILE * fp);
puto() реализован для каждого класса постоянных объектов. После вызова вверх по цепочке суперклассов он записывает собственные переменные экземпляра класса в поток. Таким образом вся информация об объекте записывается в поток, начиная с информации от самого первого суперкласса. geto() также реализован для всех постоянных объектов. Данный метод обычно симметричен к puto(), то есть после вызова вверх по цепочке суперклассов он заполняет объект значениями собственных переменных экземпляра класса, которые были записаны в поток puto(). geto() работает подобно конструктору, то есть он не выделяет память своему объекту, он просто заполняет его. Вывод, создаваемый puto(), начинается с имени класса объекта. retrieve() читает имя класса, определяет местоположение соответствующего описания класса, выделяет память для объекта и вызывает geto(), чтобы заполнить объект. Как следствие, если puto() в самом первом суперклассе записывает имя класса каждого объекта, geto() начинает чтение после имени класса. Необходимо отметить, что retrieve() может загрузить только те объекты, для которых знает описания класса, то есть с помощью ANSI-C методы для постоянных объектов должны быть априори доступны в программе, которая намеревается загрузить их с помощью retrieve(). Кроме имени класса вначале, нет никакого определённого ограничения на выходной формат, создаваемый puto(). Однако, если вывод — простой текст, puto() может также помочь в отладке, потому что с помощью подходящего отладчика может применяться к любому объекту. Для простых объектов лучше всего выводить на экран все значения переменных экземпляра. Для контейнерных объектов, указывающих на другие объекты, puto() может быть применён для записи клиентских объектов. Однако, если объекты могут содержаться в более, чем одном объекте, puto() или retrieve() должны быть разработаны осмотрительно, чтобы избежать эффекта глубокого копирования, то есть удостоверяться, что клиентские объекты уникальны. Довольно надёжное решение для загрузки объектов, созданных отдельным приложением, состоит в том, что retrieve() сохраняет таблицу исходных адресов всех загруженных объектов и создаёт объект только тогда, когда его нет в таблице.
|
Предыдущая Содержание Следующая |