Лабораторная работа №16 по VISUALC++ 2005
«Сериализация стандартных объектов при работе с файлами »
1 Задание
Создать и выполнить однодокументное Windows-приложение на «родном» C++ с использованием библиотеки MFC. Предусмотреть чтение строки символов , запись её на диск и последующее чтение из диска.
2 Общие указания
Сериализация – процесс записи на диск или чтения из него.
В большинстве программ на Visual C++ вся работа с данными происходит с документом. Основная возможность сериализации изначально встраивается мастером Application Wizard в приложения.
Обработчики для пунктов меню File ->Open, File-> Save, File-> Save As предполагают, что будет сериализация документов и уже содержат код, необходимый для её поддержки. Конкретно используются член- функция Serialize() , два макросы и пустой конструктор для документа. Дальнейшее изложение приводится для примера, когда создается программа с именем serialstandart. В этом случае мастер приложения создает классы
CserialstandartApp, CMainFraim, CserialstandartDoc,
CserialstandartView. Ниже приведен заголовочный файл serialstandartDoc.h.
#pragma once
class CserialstandartDoc : public CDocument
{
protected: // create from serialization only
CserialstandartDoc();//Пустойконструктор
DECLARE_DYNCREATE(CserialstandartDoc)//Макрос
// Attributes
public:
// Operations
public:
// Overrides
public:
virtual BOOL OnNewDocument();
virtual void Serialize(CArchive& ar);//Функциядля//сериализации
// Implementation
public:
virtual ~CserialstandartDoc();
Следует обратить внимание на выделенные жирным шрифтом фрагменты.
1) CserialstandartDoc();
2) DECLARE_DYNCREATE(CserialstandartDoc)
3) virtual void Serialize(CArchive& ar);
Во-первых,это прототип пустого конструктораCserialstandartDoc();
Пустой конструктор используется каркасом приложения для синтеза объекта при чтении из файла.
Во-вторых- макрос DECLARE_DYNCREATE(CserialstandartDoc). Онпозволяет динамически создавать объекты класса CserialstandartDoc каркасом приложения во время сериализации процесса ввода.В качестве параметра макроса служит имя сериализируемого класса. В реализации класса его дополняет макрос IMPLEMENT_DYNCREATE(CserialstandartDoc, CDocument)
(смотри файл CserialstandartDoc.cpp).
Этот макрос также создается автоматически мастером и свидетельствует, что класс CserialstandartDoc производный от CDocument. В свою очередь, CDocument является производным от CObject.
Следует иметь ввиду, что сериализация возможна для объектов лишь тех классов, которые являются прямыми или непрямыми наследниками класса CObject.
В- третьих, это член-функция
virtual void Serialize(CArchive& ar);
{
if (ar.IsStoring())
{
// TODO: add storing code here
}
else
{
// TODO: add loading code here
}
}
Функция сериализует элементы данных класса.
Поскольку мастер Application Wizard не имеет понятия о том , какие данные содержит ваш документ, процесс записи и чтения этой информации находится в вашей компетенции, о чем сказано в комментариях.
Аргументом функции является ссылка ar на класс CArchive. Этот класс управляет сериализацией. Он является MFC-эквивалентом потоковых операций С++, которые используются в консольных программах для чтения с клавиатуры и записи на экран. Объект этого класса представляет механизм для направления ваших объектов на запись в файл или на чтение, при этом реконструируя их . Он включает в себя ассоциированный с ним объект класса CFile , обеспечивающий возможности для ввода/вывода двоичных файлов , а также действительное подключение к конкретному физическому файлу. Во время сериализации объект CFile заботится о деталях операций файлового ввода/вывода, а объект CArchive имеет дело с логикой структурирования данных объекта, подлежащих записи или реконструкции объектов на основе прочитанной информации.
Класс CArchive перегружает операции вставки и извлечения (>> и <<), необходимые для ввода или вывода объектов класса, унаследованных от CObject, плюс диапазон базовых типов данных. Конкретно это следующие типы:
bool, float,double,BYTE, char, wchar_t, intиshort, longи LONG, LONGLONG, WORD и unsigned int, DWORD, CObject* , CString, SIZE и CSize, POINT и CPoint, RECT и Crect.
Таким образом, функция сериализации имеет следующий вид:
void CserialstandartDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
ar<<элемент_данных_1;
ar<< элемент_данных_2;
ar<< элемент_данных_3;
………………………………………………………………………………………….
…………………………………………………………………………………………
// TODO: add storing code here
}
else
{
ar>>элемент_данных_1;
ar>> элемент_данных_2;
ar>>элемент_данных_3;
………………………………………………………………………………………….
…………………………………………………………………………………………
// TODO: add loading code here
}
}
Если элементом данных сериализуемого класса ( в нашем случае класса CserialstandartDoc) является объект какого-либо другого класса, для которого не перегружены операции << и >>, то в функции Serialize() элементы данных этого другого класса включаются в списки наравне с элементами данных сериализуемого объекта.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.