Главная » Все файлы » Просмотр файлов из архивов » Документы » 14 Сохранение и восстановление объектов

14 Сохранение и восстановление объектов (Лекции по курсу ПОУК-1)

2017-12-28СтудИзба

Описание файла

Файл "14 Сохранение и восстановление объектов" внутри архива находится в папке "Лекции по курсу ПОУК-1". Документ из архива "Лекции по курсу ПОУК-1", который расположен в категории "". Всё это находится в предмете "программное обеспечение управляющих комплексов (поук)" из 6 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "лекции и семинары", в предмете "программное обеспечение управляющих комплексов (поук)" в общих файлах.

Онлайн просмотр документа "14 Сохранение и восстановление объектов"

Текст из документа "14 Сохранение и восстановление объектов"

7 стр. Лекция 14. Сохранение и восстановление состояния объектов

Сохранение и восстановление состояния объектов

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

Процесс выполнения такой задачи частично уже рассматривался в лекциях, посвященных однооконному и многооконному приложениям. Такие приложения, подготовленные при помощи средства 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 применяется для сериализации данных, необходимо:

  • Чтобы класс был производным от класса CObject или его потомков.

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

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

  • Определить в классе конструктор без параметров. Это может быть защищенный конструктор, если он вызывается только процесса сериализации данных. В конструкторе возможно динамическое создание объектов и инициализация переменных, если это необходимо.

  • Объявить в классе деструктор, если требуется выполнить специальные действия при разрушении объектов класса, например, освободить память динамически созданных объектов.

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

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

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

class CMyDoc:public CObject

{

DECLARE_SERIAL(CMyDoc)

protected:

virtual void Serialize(CArchive& ar);

protected:

CMyDoc();

protected:

~CMyDoc();

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

........................

};

// фрагмент файла реализации класса

IMPLEMENT_SERIAL(CMyDoc, CObject,1)

CMyDoc::CMyDoc()

{

// здесь возможно динамическое создание объектов и

// инициализация переменных, если это необходимо

…………

}

CMyDoc::~CMyDoc()

{

// здесь возможно выполнение специальных действий

// при разрушении объектов класса, например,

// освобождение памяти динамически созданных объектов

………

}

void CMyDoc::Serialize(CArchive& ar)

{

if(ar.Storing())

{

// здесь следует добавить код для записи переменных в архив

………

}

else

{

// здесь следует добавить код для чтения переменных из архива,

………

}

// здесь следует добавить вызовы методов Serialize для переменных

// класса CMyDoc, являющихся объектами классов,

// имеющих собственные методы Serialize

}

// другие методы класса

.......................

Механизм записи и восстановления объектов

Рассмотрим предлагаемую MFC модель обмена данными между документом и файлом, в котором этот процесс идет через промежуточный объект-архив класса CArchive библиотеки MFC. Этот объект передается методу Serialize класса документа как параметр. Поэтому программист посылает данные не в файл, а в архив и читает из архива.

Метод Serialize класса документа вызывается объектами-архивами, когда приложение при необходимости читает или записывает состояние этого документа, вызывая методы CArchive::ReadObject и CArchive::WriteObject для объекта-архива. При этом методу Serialize передается ссылка на объект-архив, который и вызывает методы чтения или записи.

Из архива данные передаются в файл или читаются из файла. Объект-архив всегда связан с файлом (объектом класса CFile). Диалог при открытии и сохранении документа позволяет задать имя физического файла, хранящего данные документа. Затем создается объект класса CFile, который связывается с объектом архивом. Заметим, что создаваемый автоматически объект-архив существует на время выполнения только одной операции - чтения документа или записи документа, после чего разрушается.

Рассмотрим процесс записи и восстановления документа для однооконного или многооконного приложения, создаваемого средством AppWizard. При выборе команд Open, Save, SaveAs каркас приложения:

  • Выводит соответствующее диалоговое окно для получения имени файла от пользователя.

  • Открывает файл, указанный пользователем, как объект класса CFile. Создает объект-архив класса CArchive, связывая его с объектом файлом. Объект-архив получает статус "store" или "load", в зависимости от того, будет ли данные документа записываться или восстанавливаться из архива.

  • Вызывает метод Serialize, определенный в классе документа приложения, производном от класса CDocument, используя методы WriteObject или ReadObject для объекта-архива.

  • Определенный разработчиком приложения метод Serialize класса документа запишет значения переменных документа в архив. Через буфер архива данные передаются в файл, связанный с объектом-архивом.

  • Завершив сохранение документа, каркас приложения разрушит созданный объект-архив, а затем и объект-файл.

В этом процессе на разработчика приложения возлагается единственная обязанность - определить метод Serialize класса документа. Он отвечает только за то, какие переменные документа и как будут записываться в архив.

Если программист сам организует процесс сериализации данных документа, то он сам должен проделать все перечисленные выше действия. Допустим, приложение выводит окно, которое имеет меню, содержащее пункты "Store" и "Load". Класс окна тогда имеет примерно следующее описание:

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

class CMyWnd : public CFrameWnd

{

protected:

CMyDoc *readDoc; // указатель на объект класса документа

CMyDoc writeDoc; // объект класса документа

protected:

afx_msg void OnStore();

afx_msg void OnLoad();

DECLARE_MESSAGE_MAP()

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

........................

};

При выборе пользователем из меню пункта "Store" вызывается метод-обработчик OnStore, а при выборе пункта "Load" - метод-обработчик OnLoad. Приведем примеры организации процесса сохранения и восстановления документа.

// фрагмент файла реализации класса

BEGIN_MESSAGE_MAP(CMyWnd, CFrameWnd)

ON_COMMAND(ID_LOAD, OnLoad)

ON_COMMAND(ID_STORE, OnStore)

END_MESSAGE_MAP()

void CMyWnd::OnLoad()

{

// создание стандартной панели выбора файла Open

CFileDialog DlgOpen(TRUE,NULL,NULL,

OFN_HIDEREADONLY,(LPCSTR)"Все файлы (*.*)|*.*||");

// отображение стандартной панели выбора файла Open

if(DlgOpen.DoModal()==IDOK)

{

// открытие файла для чтения

CStdioFile File(DlgOpen.GetPathName(),CFile::modeRead);

// связывание файла с объектом класса CArchive

CArchive ar(&File,CArchive::load);

// запись документа

readDoc=(CMyDoc *)ar.ReadObject(RUNTIME_CLASS(CMyDoc));

// закрыть объект ar и файл, связанный с ним

ar.Close(); File.Close();

// данные из переменных класса документа помещаются

// в переменные класса окна

.............................................

}

}

void CMyWnd::OnStore()

{

// создание стандартной панели выбора файла SaveAs

CFileDialog DlgSaveAs(FALSE,NULL,NULL,

OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,

(LPCSTR)"Все файлы (*.*)|*.*||");

// отображение стандартной панели выбора файла SaveAs

if(DlgSaveAs.DoModal()==IDOK)

{

// данные из переменных класса окна помещаются

// в переменные класса документа

....................................................

// открытие файла для записи

CFile File(DlgSaveAs.GetPathName(),

CFile::modeCreate|CFile::modeWrite);

// связывание файла с объектом класса CArchive

CArchive ar(&File,CArchive::store);

// запись документа

ar.WriteObject(&writeDoc);

// закрыть объект ar и файл, связанный с ним

ar.Close(); File.Close();

}

}

// другие методы класса

.......................

Методы класса CArchive

Перед тем, как создать объект-архив класса CArchive, необходимо создать объект класса CFile. Связывая с объектом CFile файл на диске, нужно иметь в виду, что если нужно записать данные, то файл нужно открывать на запись, а если считать - то для чтения.

Конструктор класса CArchive имеет следующий вид:

CArchive(CFile* pFile, UINT nMode, int nBufSize=512, void* lpBuf=NULL);

Параметр pFile должен содержать указатель на объект класса CFile, из которого будут считываться или записываться данные. Перед вызовом конструктора файл, связанный с объектом pFile, должен быть уже открыт.

Параметр nMode определяет, будут ли данные записываться в файл или считываться из него: CArchive::load (данные будут считываться из файла на диске), CArchive::store (данные будут записываться в файл на диске).

Для операций чтения и записи в файл класс CArchive выполняет буферизацию. Размер этого буфера определяется необязательным параметром nBufSize. По умолчанию используется буфер размером 512 байт.

Конструктор класса CArchive сам получает у операционной системы блок оперативной памяти для буфера. Однако с помощью необязательного параметра lpBuf программист может предоставить ему собственный буфер. В этом случае параметр nBufSize должен указывать размер этого буфера.

Созданный объект класса CArchive можно будет использовать только для записи или только для чтения. Если необходимо сначала считать данные, а потом записать, следует создать для этого два отдельных объекта класса CArhive.

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5168
Авторов
на СтудИзбе
438
Средний доход
с одного платного файла
Обучение Подробнее