1. 程式人生 > >Serialize序列化函式(MFC)

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中成員函式,用於判斷是讀取資料,還是儲存資料。