Скачиваний:
55
Добавлен:
01.04.2014
Размер:
960 Кб
Скачать

26. Концепция сохран.-восстановл. Объектов. Необходимые действия по сохр.-востан. Объектов класса cDocument. Разбор примера с сериализацией в классе документа.

Одна из основных задач программы — сохранять данные пользователя после их изменения. В большинстве случаев, когда приложение создается с использованием AppWizard, Visual C++ без Вашего участия включает в него программы, которые необходимы для сохранения и восстановления данных.

Одна из задач, решаемых программистом при разработке приложений, которые могут создавать и редактировать документы различных типов (например, различные редакторы), заключается в том, чтобы предоставить пользователю возможность записать внутреннее представление документа в файл и восстановить его.

Процесс сохранения и восстановления внутреннего представления объекта называется сериализацией данных. При создании приложения вам приходится иметь дело с достаточно большим разнообразием типов объектов. Одни типы объектов, хранящих данные, довольно просты, например тип int или char. Другие являются экземплярами классов — строками (экземплярами класса CString) или даже объектами классов, созданными специально для данного приложения. При использовании таких, объектов в приложении, которое должно формировать, сохранять и восстанавливать документы, разработчику необходимо изобретать средства сохранения и восстановления этих объектов с тем, чтобы можно было их восстановить. Свойство объекта сохраняться и восстанавливаться называется живучестью (persistence). Практически все классы MFC наделены этим свойством, поскольку они прямо или косвенно происходят от базового класса CObject. Последний уже обладает базовыми ф-ми сохранения-восстановления объекта.

Приложения, подготовленные при помощи средства AppWizard, используют этот механизм с помощью методов класса CDocument. Программисту предлагается только переопределить метод Serialize этого класса для работы с конкретными данными приложения. Программист может определить свой класс (на основе базового класса CObject) для работы с данными и определить в нем механизм записи и восстановления объектов.

Создание класса, обеспечивающего сериализацию данных

Библиотека классов MFC определяет механизм записи и восстановления объектов (serialization), причем поддержка этого механизма осуществляется средствами класса CObject.

Классы, наследованные от CObject, также могут обеспечивать работу механизма записи и восстан-я объектов. Для этого при объявл-и класса надо указать макрокоманду DECLARE_SERIAL, а при определении - макрокоманду IMPLEMENT_SERIAL.

Макрокоманду DECLARE_SERIAL необходимо поместить в описании класса в заголовочном файле. В качестве параметра макрокоманды надо указать имя класса

DECLARE_SERIAL (имя_класса)

Макрокоманду IMPLEMENT_SERIAL следует указать перед упоминанием класса в файле исходного текста приложения. Прототип макрокоманды IMPLEMENT_SERIAL представлен ниже:

IMPLEMENT_SERIAL(имя_класса,имя_баз_класса,номер_версии)

имя_класса определяет имя класса, имя_базового_класса - имя базового класса, из кот-го непосредственно наследуется класс. Последний параметр номер_версии - это число типа UINT, определяющее версию программы.

В классе должны быть определены специальные методы для записи и восстановления состояния объектов этого класса..

Методы, сохраняющие и восстанавл-е объекты, взаимод-т с объектом класса CArchive, кот-й осуществляет непосредственную запись и чтение информации из файла на диске.

Класс CObject содержит виртуальный метод Serialize, отвечающий за запись и чтение объектов классов, наследованных от класса CObject: virtual void Serialize(CArchive& ar);

В качестве параметра ar методу передается указатель на объект класса CArchive, использ-й для записи и восстан-я состояния объекта класса CObject (или наследуемого от него класса). Чтобы узнать, какую операцию д.выполнить метод Serialize, необходимо воспольз-ся методами IsLoading или IsStoring класса CArchive.

Итак, при создании нового класса, в котором метод Serialize применяется для сериализации данных, необходимо:

1) Чтобы класс был произв-м от класса CObject или его потомков.

2) При объявлении класса необходимо вставить макрокоманду DECLARE_SERIAL.

3)Определить в классе функцию Serialize, отвечающую за хранение переменных класса.

4) Определить в классе конструктор без параметров.

5) Объявить в классе деструктор.

6) При реализации класса в начало файла реализации вставить макрос IMPLEMENT_SERIAL. У этой макрокоманды три парам-ра: имя класса, имя базового класса и номер версии формата файла, хранящего документ. Можно иметь несколько модификаций документа и с каждой из них связать свою версию.

Шаблон (заготовка) файлов определения и реализации класса, который обеспечивает процесс сериализации данных

// фрагмент файла определения класса

class CMyDoc:public CObject

{ DECLARE_SERIAL(CMyDoc)

protected: virtual void Serialize(CArchive& ar);

protected: CMyDoc();

protected: ~CMyDoc();

// другие описания класса . . . };