В этом процессе на разработчика приложения возлагается единственная обязанность - определить метод Serialize класса документа. Он отвечает только за то, какие переменные документа и как будут записываться в архив.
Если программист сам организует процесс сериализации данных документа, то он сам должен проделать все перечисленные выше действия. Допустим, приложение выводит окно, которое имеет меню, содержащее пункты "Store" и "Load". Класс окна тогда имеет примерно следующее описание:
// фрагмент файла определения класса class CMyWnd : public CFrameWnd { protected: CMyDoc *readDoc; // указатель на объект класса документа CMyDoc writeDoc; // объект класса документа
protected: afx_msg void OnStore(); afx_msg void OnLoad(); DECLARE_MESSAGE_MAP() // другие описания класса ........................ };
При выборе пользователем из меню пункта "Store" вызывается метод-обработчик OnStore, а при выборе пункта "Load" - метод-обработчик OnLoad. Приведем примеры организации процесса сохранения и восстановления документа.
// фрагмент файла реализации класса BEGIN_MESSAGE_MAP(CMyWnd, CFrameWnd) ON_COMMAND(ID_LOAD, OnLoad) ON_COMMAND(ID_STORE, OnStore) END_MESSAGE_MAP() void CMyWnd::OnLoad() { // создание стандартной панели выбора файла Open CFileDialog DlgOpen(TRUE,NULL,NULL, OFN_HIDEREADONLY,(LPCSTR)"Все файлы (*.*)|*.*");
// отображение стандартной панели выбора файла Open if(DlgOpen.DoModal()==IDOK) { // открытие файла для чтения CStdioFile File(DlgOpen.GetPathName(),CFile::modeRead);
// связывание файла с объектом класса CArchive CArchive ar(&File,CArchive::load);
// запись документа readDoc=(CMyDoc *)ar.ReadObject(RUNTIME_CLASS(CMyDoc));
// закрыть объект ar и файл, связанный с ним ar.Close(); File.Close();
// данные из переменных класса документа помещаются // в переменные класса окна ............................................. } } void CMyWnd::OnStore() { // создание стандартной панели выбора файла SaveAs CFileDialog DlgSaveAs(FALSE,NULL,NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, (LPCSTR)"Все файлы (*.*)|*.*");
// отображение стандартной панели выбора файла SaveAs if(DlgSaveAs.DoModal()==IDOK) { // данные из переменных класса окна помещаются // в переменные класса документа ....................................................
// открытие файла для записи CFile File(DlgSaveAs.GetPathName(), CFile::modeCreate|CFile::modeWrite);
// связывание файла с объектом класса CArchive CArchive ar(&File,CArchive::store);
// запись документа ar.WriteObject(&writeDoc);
// закрыть объект ar и файл, связанный с ним ar.Close(); File.Close(); } } // другие методы класса .......................