Serialize序列化函式(MFC)
要實現一個能夠序列化的類,必須要經過一下幾步
1.這個類必須間接火直接地由CObject派生而來
2.定義一個不帶引數的建構函式
3.在標頭檔案中,必須有如下宣告:
DECLARE_SERIAL( Your name of class)
4.在原始檔中開頭有如下宣告
IMPLEMENT_SERIAL (Your nameofclass,CObject,1)
其中的第三個引數代表版本號
5.必須過載基類中的序列化函式Serialize
經過以上五步,一個帶有儲存功能的類就誕生了
序列化(Serialization)
1、 序列化提出和定義
序列化在面向物件的程式設計中出現的,它基於物件是可以連續的思想,在程式退出或者啟動的時候,可以把物件順序的儲存在磁碟或者從磁碟讀出,儲存和讀出物件的過程叫做序列化。
2、 序列化儲存的應用和侷限
序列化儲存可以把物件儲存到磁碟上,但它並不能代替資料庫設計的資訊儲存,因為它只是順序的存取,沒有檢索機制。
3、 序列化的類
序列化的類可以直接或者間接從CObject類派生,類的宣告中必須包含DECLARE_SERIAL巨集呼叫,實現檔案也必須有與之對應的巨集:
IMPLEMENT_SERIAL。(注意:DECLARE_SERIAL/IMPLEMENT_SERIAL包含了DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC巨集)。
4、 MFC中序列化的使用
如果應用程式沒有進行直接磁碟操作的輸入輸出,而是依靠序列化的過程,那麼就不必直接使用CFile物件。MFC庫中文件類的Serialize函式和CFile物件之間有一個CArchive物件。該物件為CFile物件緩衝資料並保持一個內部標誌,來指明是儲存或者載入物件。MFC應用程式框架負責CFile和Carchive物件構造及關聯。在自動生成的選單FileOpen和FileSave等過程中,應用程式框架會呼叫文件的Serialize函式,我們可以在該函式中處理特定類物件的序列化。
下面是摘自vc技術內幕上的程式碼:
void CStudentDoc::Serialize(CArchive&ar)
{
TRACE("Entering CStudentDoc::Serialize\n");
if (ar.IsStoring())
{
// TODO: add storing code here
}
else
{
// TODO: add loading code here
}
m_studentList.Serialize(ar);
}
MFC程式在開啟或關閉檔案操作的時候,會呼叫該函式。預設的該函式並沒有對我們自己的資料(m_studentList)進行存取。我們在該函住中加入的最後一行程式碼序列化了我們的資料物件。當然這都需要我們自己編寫自己資料類的Serialize函式。如下:(摘自vc技術內幕上的程式碼)
void CStudent::Serialize(CArchive&ar)
{
TRACE("Entering CStudent::Serialize\n");
if(ar.IsStoring()) {
ar << m_strName <<m_nGrade;
}
else {
ar >> m_strName >>m_nGrade;
}
}
文件序列化中的CArchive過載的操作符。ar<<其實就是向檔案寫入!操作符過載就不多說了。
這裡是MFC中關於永久儲存機制的序列序列化操作。
CArchive是windows中已經定義好的文件類。
上述這段程式碼總體意思就是,當向ar儲存資料時,把m_nType、m_strFileName、m_dwFileSize儲存到ar中;當讀取ar中資料時,把ar中的資料讀取到m_nType、m_strFileName、m_dwFileSize中。
<<與>>都已經被過載,不是原先的左右移的意思,而是序列化的方向,也就檔案是儲存還是讀取。
比如:ar << m_nType表示把m_nType資訊序列化到ar中,也就是把m_nType資訊儲存到ar中;以此類推ar >> m_nType表示把ar中的資訊序列化到m_nType,也就是寫入m_nType中。
IsStoring()是CArchive中成員函式,用於判斷是讀取資料,還是儲存資料。