Сериализация стандартных объектов при работе с файлами (Лабораторная работа № 16 по VISUALC++ 2005)

Страницы работы

Содержание работы

Лабораторная работа №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() элементы данных этого другого класса включаются в списки  наравне с элементами данных сериализуемого объекта.

Похожие материалы

Информация о работе

Тип:
Методические указания и пособия
Размер файла:
62 Kb
Скачали:
0