Здорова!
Сегодня разберем как создать сериализацию для диалогового приложения. И так приступим. Создаем диалоговое приложение, в классе диалога перезагружаем функцию Serialize и добавляем в нее код
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
void Ctest_fl_ruDlg::Serialize(CArchive& ar) { AfxMessageBox(L"Serialize"); TRACE("Serialize\n"); CDialogEx::Serialize(ar);//вызываем функцию предка if (ar.IsStoring()) { // storing code ar <<m_cLogin<<m_cPass; } else { // loading code TRACE("Loading code\n"); ar >>m_cLogin>>m_cPass; } } |
[warning]Нужно вроде обязательно вызвать функцию для базового класса CDialogEx::Serialize[/warning]
Дальше нужно добавить в определение класса макрос
1 |
DECLARE_SERIAL(Ctest_fl_ruDlg) |
и в файл с определениями функций класса
1 |
IMPLEMENT_SERIAL(Ctest_fl_ruDlg,CDialogEx,1) |
Если мы сейчас скомпилируем приложение то функция сериализации вызываться не будет, нам нужно добавить в конструктор ее вызов и в деструктор класса. Ну я так сделал. Вот код конструктора
Ctest_fl_ruDlg::Ctest_fl_ruDlg »
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
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 »
1 2 3 4 5 6 7 8 9 |
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
[warning]У меня были проблемы, постоянно вылетало необработаное исключение что типо конец файла не определен, оно перестало вылетать когда я изменил флаг на CFile::modeRead, а был у меня CFile::modeRead|СFile::modeCreate[/warning]
И CArchive создается в деструкторе с флагом CArchive::store для записи, а в конструкторе с CArchive::load для загрузки.
За CArchive можно почитать тут.
На этом все, я такой способ использовал. Кстати в коде выше вы можете увидеть как обрабатываются исключения CArchiveException* e, они закомментированы, да я ниже приведу код блока
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
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; } } |
Таким способом вылавливаются исключения. 🙂