MFC Сериализация диалогового приложения Serialize

Рубрика: MFC, Дата: 22 August, 2015, Автор:

Здорова!

Сегодня разберем как создать сериализацию для диалогового приложения. И так приступим. Создаем диалоговое приложение, в классе диалога перезагружаем функцию Serialize и добавляем в нее код

Ctest_fl_ruDlg::Serialize »

void Ctest_fl_ruDlg::Serialize(CArchive& ar)
{
	AfxMessageBox(L"Serialize");
	TRACE("Serializen");
	CDialogEx::Serialize(ar);//вызываем функцию предка
	if (ar.IsStoring())
	{	// storing code
		ar <<m_cLogin<<m_cPass;
	}
	else
	{	// loading code
		TRACE("Loading coden");
		ar >>m_cLogin>>m_cPass;
	}
}
Нужно вроде обязательно вызвать функцию для базового класса CDialogEx::Serialize

Дальше нужно добавить в определение класса макрос

DECLARE_SERIAL(Ctest_fl_ruDlg)

и в файл с определениями функций класса

IMPLEMENT_SERIAL(Ctest_fl_ruDlg,CDialogEx,1)

Если мы сейчас скомпилируем приложение то функция сериализации вызываться не будет, нам нужно добавить в конструктор ее вызов и в деструктор класса. Ну я так сделал. Вот код конструктора

Ctest_fl_ruDlg::Ctest_fl_ruDlg »

Ctest_fl_ruDlg::Ctest_fl_ruDlg(CWnd* pParent /*=NULL*/)
	: CDialogEx(Ctest_fl_ruDlg::IDD, pParent)
	, m_cLogin(_T(""))
	, m_cPass(_T(""))
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

	//читаем из файла
//	try
	{
		CFile file;
		if(file.Open(L"SAVE.TXT", CFile::modeRead))	// создать файл
		{
			CArchive ar(&file, CArchive::load);				// на основе него обьект архив
			Serialize(ar);								// записать в архив
			ar.Close();								// закрыть архив
			file.Close();
		}
	}
	/*catch(CArchiveException* e)
	{
		if (e->m_cause == CArchiveException::endOfFile)
		{
			e->Delete();
			return;
		}
		else
		{
			throw;
		}
	}*/
}

Ctest_fl_ruDlg::~Ctest_fl_ruDlg »

Ctest_fl_ruDlg::~Ctest_fl_ruDlg()
{
	//делаем сериализацию
	CFile file(L"SAVE.TXT", CFile::modeWrite | CFile::modeCreate);	// создать файл
    CArchive ar(&file, CArchive::store);				// на основе него обьект архив
    Serialize(ar);								// записать в архив
	ar.Close();								// закрыть архив
    file.Close();							// закрыть файл
}

Мы в конструкторе и деструкторе создаем архив и вызываем функцию Serialize

У меня были проблемы, постоянно вылетало необработаное исключение что типо конец файла не определен, оно перестало вылетать когда я изменил флаг на CFile::modeRead, а был у меня CFile::modeRead|СFile::modeCreate

И CArchive создается в деструкторе с флагом CArchive::store для записи, а в конструкторе с CArchive::load для загрузки.

За CArchive можно почитать тут.

На этом все, я такой способ использовал. Кстати в коде выше вы можете увидеть как обрабатываются исключения CArchiveException* e, они закомментированы, да я ниже приведу код блока

Показать »

try
{
	CFile file;
	if(file.Open(L"SAVE.TXT", CFile::modeRead))	// создать файл
	{
		CArchive ar(&file, CArchive::load);				// на основе него обьект архив
		Serialize(ar);								// записать в архив
		ar.Close();								// закрыть архив
		file.Close();
	}
}
catch(CArchiveException* e)
{
        //проверяем тип сообщения
	if (e->m_cause == CArchiveException::endOfFile)
	{
		e->Delete();
		return;
	}
	else//идет обработка сообщений дальше
	{
		throw;
	}
}

Таким способом вылавливаются исключения. 🙂

 

Комментарии:


Оставить комментарий

Your email address will not be published. Required fields are marked *