Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Visual1.doc
Скачиваний:
8
Добавлен:
07.03.2016
Размер:
4.35 Mб
Скачать

7.2. Серіалізація даних, клас cArchive

Приклад роботи з серіалізацією даних знаходиться у папці DISK\File\writer.

Серіалізацією називається процес запису або читання деякого об'єкта з диска. У даному блоці наведено процес серіалізації як стандартних, так і нестандартних об'єктів (класів).

У даному блоці наведено дві програми. Перша з них, writer, дозволяє вводити текст з клавіатури, поміщати його в змінну типу CString, а потім використовуючи серіалізацію, записувати даний рядок на диск, а також зчитувати його. Друга програма призначена для серіалізації нестандартних об'єктів і називається serializer.

Послідовність роботи.

1. Створимо однодокументну (Single) програму writer. Для початку створимо змінну StringData класу CString в класі CWriterDoc і ініціалізуємо її в конструкторі: StringData = "".

2. Для введення тексту з клавіатури в змінну StringData, створимо в класі CWriterView метод OnChar(), який виконується за повідомленням WM_CHAR.

void CWriterView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)

{

CWriterDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

pDoc->StringData+= nChar;

Invalidate();

pDoc->SetModifiedFlag();

CView::OnChar(nChar, nRepCnt, nFlags);

}

Для відображення тексту у вікні викликається метод OnDraw(), фрагмент програми якого наводиться нижче:

void CWriterView::OnDraw(CDC* pDC)

{

CWriterDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

pDC->TextOut(0,0,pDoc->StringData);

}

3. Серіалізація об'єкта StringData виконується за допомогою функції Serialize() класу CWriterDoc.

void CWriterDoc::Serialize(CArchive& ar)

{

if (ar.IsStoring())

{

ar << StringData;

}

else

{

ar >> StringData;

}

}

Цій функції передається об'єкт класу CArchive. Спочатку викликається метод IsStoring() об'єкту ar, який повертає true, якщо виконується запис на диск (натискання опції меню "Save" або "Save As"). В іншому випадку з диска зчитується раніше створений файл, який містить рядок. При закритті програми, якщо рядок не був записаний на диск, на екрані виведеться повідомлення про виконання цієї дії. Це можливо тільки в тому випадку, якщо у функції OnChar() буде викликаний метод SetModifiedFlag().

Приклад роботи з серіалізацією об’єктів знаходиться у папці DISK\File\Serializer.

4. Створимо новий клас CData, дані якого будуть записуватися та зчитуватися з диску. Для його створення необхідно виконати команду меню Visual C++ File → New, виділити опцію C/C++ Header File і в полі File Name ввести ім'я файлу CData.h. Вміст цього файлу наводиться нижче.

class CData : CObject

{

private:

CString data;

DECLARE_SERIAL(CData);

public:

CData() {data = CString("");}

void AddText(CString text)

{data += text;}

void DrawText(CDC* pDC)

{pDC-> TextOut(0,0,data);}

void ClearText() {data = "";}

void Serialize(CArchive& archive);

};

У цьому класі всі функції визначені при його оголошенні, за винятком функції Serialize(), в якій відбувається серіалізація об'єкта.

Дана функція визначена у файлі CData.cpp. Для його створення необхідно виконати команду меню Visual C++ File → New, потім виділити опцію C++ Source File і в полі File Name ввести ім'я файлу CData.cpp. Приведемо зміст цього файлу:

#include "stdafx.h"

#include "SerializerDoc.h"

void CData::Serialize(CArchive & archive)

{

CObject::Serialize(archive);

if (archive.IsStoring())

{

archive << data;

}

else

{

archive >> data;

}

}

IMPLEMENT_SERIAL(CData, CObject,0)

5. Об'єкт класу CData помістимо в клас CSerializerDoc, а в конструкторі цього класу зробимо його оголошення. При цьому не забудьте включити заголовок класу CData (CData.h).

#include "CData.h"

class CSerializerDoc : public CDocument

{

protected:

CSerializerDoc();

DECLARE_DYNCREATE(CSerializerDoc)

public:

CData DataObject;

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

}

6. Щоб зробити серіалізацію об'єкта DataObject в нашому документі необхідно у функції Serialize() класу CSerializerDoc помістити лише один рядок:

void CSerializerDoc::Serialize(CArchive& ar)

{

DataObject.Serialize(ar);

}

7. Для формування об'єкта DataObject (заповнення його рядку типу CString і виведення його у вікно), функції OnChar() і OnDraw() будуть мати такий вигляд:

void CSerializerView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)

{

CSerializerDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

pDoc->DataObject.AddText(CString(nChar));

Invalidate();

CView::OnChar(nChar, nRepCnt, nFlags);

}

void CSerializerView::OnDraw(CDC* pDC)

{

CSerializerDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

pDoc->DataObject.DrawText(pDC);

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]