(本文只適合初學者閱讀,如果你是高手,而且你非要看,那就當成是茶余飯後的消遣吧.:-))
我剛開始學VC的時候一直被那讓人頭痛的Document/VIEw結構給搞的頭暈.
真的,我還記得第一次使用串行輸出,ar<<m_xxx;這樣的東西,當時我怎麼也搞不明白,是個怎麼會事情.後來,我知道是CArchive重載了<<和>>兩個操作符.作用是吧,對象中的數據永久保存到磁盤上(說句笑話,這裡永久是相對的如果你把磁盤格式化一樣什麼也沒了).可是這些一般都是在CDocument類的派生類中重寫Serialize函數來完成的.這是很自然,因為CDocument可以理解是一個文件的抽象形式而View則正是需要Document提供的數據,來完成對用戶的顯示.可是想想.如果,我是如果,有一天用戶都是瞎子,或者他們不想看所有的數據,那要是還是吧,那些要顯示和不要顯示的數據都放在CDocument類中嗎?那樣結構顯然是有點亂.是的,CDocument完全是因為要和CView進行交互才必須要用到的.那麼好吧,雖然不要用戶看見那些數據,可是又必須要保存的數據,我們該怎麼辦?是啊,誰都想的到,一定要用到Serialize否則什麼也無法進行根據MSDN的說法.要擁有Serialize必須要從CObject類派生類才可以那樣做.還要什麼想想看當然是一個SaveData和一個LoadData了,要知道我們只是不想讓用戶來干預,而不是不處理這些數據,也就是說這些數據僅僅只是不和VIEw打交道.那麼好吧,我還是來點例子,那樣會更有說服力我先在CSerData.hclass CSerData : public CObject{
DECLARE_SERIAL(CSerData)//千萬別忘了這個宏否則什麼也做不了(建議參考<<深入淺出MFC>>)
public:
virtual void Serialize(CArchive& ar);
int m_nID;
CString m_strName;
Bool m_IsSave=False;
SaveData();
LoadData();
};
瞧見了,我要改寫Serialize那個虛函數.要不怎麼能完成我們自己的事情呢?還有我添加了兩個要存儲的數據,一個int和一個CString,你可以把它想象成,一個唯一標示的ID和一個可以相同的名字.你甚至可以把它想象成,一份黑名單,一個凡是讓你討厭的用戶的名單列表可你不會傻到要那些用戶看見,否則他就會去修改這些數據了.呵呵..當然這是打個比方.下面我們來實現CPP文件.
#include "stdafx.h"
#include "CSerData.h"
IMPLEMENT_SERIAL(CInfo,CObject,1)
void CInfo::Serialize(CArchive& ar)
{
if (ar.IsLoading()) // If you are loading data from the disk
{
ar >> m_strName;
ar >> m_nID;
}
else // If you are storing data to the disk
{
ar << m_strName;
ar << m_nID;
}
}
就想你常做的那樣,僅僅只是ar<<m_xxxx;和在CDocument中的一樣,當然,這是必須的.接下來,看看我們還要做點什麼?別忘了,如果不把它們寫到文件裡,你也別想知道那些用戶進了黑名單.記得這文件只有你才打的開.好吧,還記得,我在CSerData.H中的 SaveData();和LoadData();,這兩個函數嗎?是的,它們就是來完成這一工作的(也許把它們寫到類的外面成為一個全局函數更為符合C++風格.可我覺得真正的OO應該寫類內)如果你不願意那樣做,你可以寫到外面,我想只要你願意,編譯器也不發火,沒人管的著你.
#define DATA_FILE _T("DataTest.dat")
void SaveData()
// Code to serialize and save the data
{
UINT nFlags = CFile::typeBinary | CFile::modeWrite;
if (_Access(DATA_FILE, 0))
{
nFlags |= CFile::modeCreate;
// The file doesn't exist, so create it
m_bCanSave = TRUE;
}
else
{
int nTemp = _Access(DATA_FILE, 6);
// Check Read Write Permissions
if(nTemp==0)
m_bCanSave = TRUE;
}
if (m_bCanSave)
{
CFile file;
CFileException fe;
// The file exists with read & write permissions
if (file.Open(DATA_FILE, nFlags, &fe))
{
CArchive ar(&file, CArchive::store);
UpdateData(TRUE);
CSerData.m_nID = m_nID;
CSerData.m_strName = m_strName;
CSerData.Serialize(ar); // Serialize the data
}
}
}
上面的save操作已經結束,我想該是load的時候了
void LoadData()
//Code to load data
{
if (_Access(DATA_FILE, 6)==0) // If File Exists
{
CFile file;
CFileException fe;
if (file.Open(DATA_FILE,CFile::typeBinary |
CFile::modeRead, &fe))
{
CArchive ar(&file, CArchive::load);
Info.Serialize(ar);
}
}
m_nID = CSerData.m_nID;
m_strName = CSerData.m_strName;
UpdateData(FALSE);
}
終於寫完了,希望不是那麼糟糕.希望有點人氣度.我在上面說了,本文只適合初學者如果你是高手,讀到這兒.就已經說明,你今天很閒,或者你是來找點茶余飯後的消遣那好吧,我的文章希望就能帶給你們這麼多,下次見.