MFC 学习笔记(11)

反序列化:

MFC 学习笔记

文章插图
序列化类对象:就是序列化类对象的各个成员变量
序列化类对象的使用:
MFC 学习笔记

文章插图
伪代码:
CFile file;file.Open("E:/MFC/Day08/serial.txt", CFile::modeCreate|CFile::modeWrite);CArchive ar(&file, CArchive::store, 4096);//归档类对象,维护缓冲区 。CMyDoc data(18, 88.5, "zhangsan");ar << &data =https://www.huyubaike.com/biancheng/== operator<<(ar, const &data){ar.WriteObject(&data)//函数内部this为&ar{CRuntimeClass* pClassRef = &data->GetRuntimeClass();//文档类静态变量WriteClass(pClassRef);//将类的相关信息(类名/类大小/类版本)存入ar维护的buff中(&data)->Serialize(ar)//函数内部this为&data{ar << this->m_age << this->m_score << this->m_name; //序列化基本类型变量}}}CFile file;file.Open("E:/MFC/day08/serial.txt", CFile::modeRead );CArchive ar( &file, CArchive::load, 4096 );//维护一个buff,大小4096字节CMyDoc* pdata = https://www.huyubaike.com/biancheng/NULL;//????????????ar >> pdata === operator>>(ar, pdata){pdata = ar.ReadObject(RUNTIME_CLASS(CMyDoc))//函数内部this为&ar{CRuntimeClass* pClassRef = ReadClass(RUNTIME_CLASS(CMyDoc),...);//从文件读取 类的相关信息,和 RUNTIME_CLASS(CMyDoc)中信息进行比对,//如果相同返回RUNTIME_CLASS(CMyDoc),如果不同返回NULLCObject*pOb = RUNTIME_CLASS(CMyDoc)->CreateObject();//动态创建CMyDoc类的对象,并返回对象地址pOb->Serialize(ar)//函数内部this为刚刚创建的CMyDoc类对象(pOb){ar >> m_age >> m_score >> m_name;//反序列化基本类型变量}return pOb;}}代码:
#include <afxwin.h>#include <iostream>using namespace std;class CMyDoc : public CDocument{// DECLARE_SERIAL( CMyDoc ) _DECLARE_DYNCREATE(CMyDoc) //动态创建机制的声明宏 AFX_API friend CArchive& AFXAPI operator>>(CArchive& ar, CMyDoc* &pOb);//操作符重载函数public: CMyDoc(int age=0, float score=0.0, CString name=""):m_age(age),m_score(score),m_name(name){} int m_age; float m_score; CString m_name; virtual void Serialize( CArchive& ar );};IMPLEMENT_SERIAL( CMyDoc, CDocument, 1 )/*动态创建机制实现宏站出来的东西CArchive& AFXAPI operator>>(CArchive& ar, CMyDoc* &pOb){ pOb = (class_name*) ar.ReadObject(RUNTIME_CLASS(CMyDoc));return ar;}*/void CMyDoc::Serialize( CArchive& ar ){ if( ar.IsStoring() ){ar << this->m_age << this->m_score << this->m_name; //序列化基本类型变量 }else{ar >> m_age >> m_score >> m_name;//反序列化基本类型变量 }}void Store( ){//序列化(存储、写)数据 CFile file; file.Open("E:/MFC/Day08/serial.txt", CFile::modeCreate|CFile::modeWrite); CArchive ar(&file, CArchive::store, 4096);//归档类对象,维护缓冲区 。CMyDoc data(18, 88.5, "zhangsan"); ar << &data; //序列化对象,就是将对象的各个成员变量序列化 。ar.Close( ); file.Close( );}void Load( ){//反序列化(加载/读) CFile file; file.Open( "E:/MFC/day08/serial.txt", CFile::modeRead ); CArchive ar( &file, CArchive::load, 4096 );//维护一个buff,大小4096字节 CMyDoc* pdata = https://www.huyubaike.com/biancheng/NULL; ar >> pdata; ar.Close( ); file.Close( ); cout << pdata->m_age <<' ' << pdata->m_score << ' ' << pdata->m_name << endl;}int main(){ Store( ); Load( ); return 0;}八.对话框机制win32创建无模式对话框:#include <windows.h>#include "resource.h"HINSTANCE g_hInstance = 0;INT CALLBACK DlgProc( HWND hwndlg, UINT msgID, WPARAM wParam, LPARAM lParam ){ switch( msgID ){ case WM_DESTROY:MessageBox( NULL, "我要死了", "Infor", MB_OK );break; case WM_SYSCOMMAND:if( wParam == SC_CLOSE ){HWND hWnd = GetParent( hwndlg );EnableWindow(hWnd ,TRUE );DestroyWindow( hwndlg );//销毁无模式对话框, 切忌不能EndDialog//EndDialog( hwndlg, 1001 );//只能隐藏无模式对话框, 可以销毁模式对话框}break; } return FALSE;//对话框的消息交给真正对话框窗口处理函数处理 。}void OnNoModel( HWND hWnd ){ EnableWindow( hWnd, FALSE );// HWND hDlg = CreateDialog( g_hInstance, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, DlgProc );//直接创建 HRSRC hRs = FindResource( g_hInstance, MAKEINTRESOURCE(IDD_DIALOG1), RT_DIALOG ); HGLOBAL hGl = LoadResource( g_hInstance, hRs ); LPCDLGTEMPLATE pTemplate = (LPCDLGTEMPLATE)LockResource( hGl ); HWND hDlg = CreateDialogIndirect( g_hInstance, pTemplate, hWnd, DlgProc ); ShowWindow( hDlg, SW_SHOW );}void OnCommand( HWND hWnd, WPARAM wParam ){ switch(LOWORD(wParam)){ case ID_NOMODEL:OnNoModel( hWnd );break; }}//窗口处理函数( 自定义,处理消息)LRESULT CALLBACK Wnd

经验总结扩展阅读