日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MFC的Serialize机制及其使用(转)

發(fā)布時間:2023/12/18 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MFC的Serialize机制及其使用(转) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. OnNewDocument()調用過程:

? 程序啟動->CWinApp:;OnFileNew(m_pDocManager->OnFileNew()) ->CDocManager::OnFileNew(pTemplate->OpenDocumentFile(NULL)) ->CSingleDocTemplate::OpenDocumentFile(CreateNewDocument->CreateNewFrame?? ? pDocument->OnNewDocument) -> CGraphicDoc::OnNewDocument

2.Serialize()調用過程

文件打開菜單命令->CWinApp::OnFileOpen(m_pDocManager->OnFileOpen()) ->CDocManager::OnFileOpen(調用DoPromptFileName函數顯示文件打開對話框->AfxGetApp()->OpenDocumentFile) ->CWinApp::OpenDocumentFile(m_pDocManager->OpenDocumentFile) ->CDocManager::OpenDocumentFile ->CSingleDocTemplate::OpenDocumentFile(pDocument->OnOpenDocument) ->CDocument::OpenDocument(構造一個CFile::modeRead模式的Cfile對象-》構造一個CArchive::load模式的CArchive對象-》Serialize(loadArchive))->CGraphicDoc::Serialize

?

?[文件\新建]和【文件\打開】菜單項的命令響應函數都是在CWinApp類中提供的。CWinApp類有一個成員變量:m_pDocManager,是指向CDocManager對象的指針,也就是說,CWinApp負責管理文檔管理器,而后者有一個文檔模板指針鏈表:m_templateList,用來保存文檔模板的指針,即文檔管器負責管理文檔模板,而后者又是用來管理文檔類、框架類和視類的,始終讓這三個對象三位一體,一起為文檔服務。

MFC提供了非常方便的串行化函數Serialize()。利用這個機制可以很方便的對文檔進行存取和讀取。

Serialization就是面向對象世界里面的永久生存機制,對象必須能夠永久生存,也就是他們必須能夠在程序結束時存儲到文件當中,并且能夠在程序重新激活時在恢復過來,存儲和恢復對象的過程在MFC稱之為Serialization,負責這項重要任務的是MFC Object類中的一個名為Serialize()的虛函數,文件的讀寫操作均通過它來方便的完成。

一個類要支持Serializable,必須遵循以下步驟:

該類必須要繼承自CObject

在該類的頭文件中添加DECLARE_SERIAL宏

在該類的實現文件中添加 IMPLEMENT SERIAL宏

為該類添加一個缺省構造函數

在該類中重寫Serialize( CArchive& ar )函數

之后,該類就可以被Serializable。

如何使用:

譬如我們新建一個MFC應用程序,為了方便處理數據,我們在程序中單獨創(chuàng)建自己的類MyClass:

MyClass:public CObject

{

DECLARE_SERIAL(MyClass) ????//很重要一定要加上

?

public:

???virtual void Serialize(CArchive& ar);

public:

???int m_iVal;

???float m_fVal;

};

在實現文件中:

IMPLEMENT_SERIAL(MyClass,CObject,1)

?

void MyClass::Serialize(CArchive& ar)

{

???if(ar.IsLoading())

???{

??????//從文件中讀取數據到內存中

??????ar >> m_iVal;

??????ar >> m_fVal;

???}

???else if(ar.IsStoring())

???{

??????ar << m_iVal;

??????ar << m_fVal;

???}

}

然后在MFC程序的C**Doc類中添加一個MyClass類型的對象myclass:

class C***Doc : public CDocument

{

public:

??C***Doc();

??DECLARE_DYNCREATE(C***Doc)

?

public:

??MyClass myclass;

?

public:

??virtual void Serialize(CArchive& ar);

?

*******

?

}

并且在C***Doc類的Serialize()函數中調用我們的myclass對象的Serialize函數就可以永久保存myclass對象了:

IMPLEMENT_DYNCREATE(C***Doc, CDocument)

?

BEGIN_MESSAGE_MAP(C***Doc, CDocument)

END_MESSAGE_MAP()

?

IMPLEMENT_SERIAL(MyClass,CObject,1);

?

void C***Doc::Serialize(CArchive& ar)

{

?if (ar.IsStoring())

?{

???myclass.Serialize(ar);

?}

?else

?{

???myclass.Serialize(ar);

?}

}

如何觸發(fā)Serialize

當我們新建一個基于文檔的MFC程序時,向導會自動為我們創(chuàng)建一些菜單,點擊菜單的保存或者打開文件按鈕時,內部機制自動觸發(fā)Serialize函數調用,那么怎樣在程序中自己觸發(fā)Serialize呢?

剖開文件保存和打開內部機制(詳見深入淺出MFC),對于讀取文件,會得到類似這樣的調用來觸發(fā)Serialize加載機制:

CFileException fe;

CFile *pFile=GetFile("d://file.txt",

??????????????CFile::modeRead | CFile::shareDenyWrite,

??????????????&fe);

DeleteContents();

SetModifiedFlag();

CArchive loadArchive(pFile,CArchive::load );

loadArchive.m_pDocument=this;

loadArchive.m_bForceFlat=FALSE;

CWaitCursor wait;

if(pFile->GetLength()!=0)

???Serialize(loadArchive);

loadArchive.Close();

ReleaseFile(pFile,FALSE);

類似的,可以使用下面的操作來觸發(fā)Serialize保存機制:

CFileException fe;

CFile *pFile=GetFile("d://file.txt",CFile::modeCreate|

?????????CFile::modeWrite | CFile::shareDenyWrite,

?????????&fe);

DeleteContents();

SetModifiedFlag();

CArchive saveArchive(pFile,CArchive::store );

saveArchive.m_pDocument=this;

saveArchive.m_bForceFlat=FALSE;

CWaitCursor wait;

if(pFile->GetLength()!=0)

Serialize(saveArchive);

saveArchive.Close();

ReleaseFile(pFile,FALSE);

轉:http://blog.sina.com.cn/s/blog_914851f70102v2i2.html

總結

以上是生活随笔為你收集整理的MFC的Serialize机制及其使用(转)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。