古詩詞大全網 - 四字成語 - DECLARE_SERIAL的概念

DECLARE_SERIAL的概念

DECLARE_SERIAL / IMPLEMENT_SERIAL 宏的技術詳解(轉) DECLARE_DYNAMIC表明的是支持類型信息, 有了這個宏,我們就可以判斷壹個類究竟是什麽類,比如

class A;

class B:public A;

A a;

B b;

有壹個指針 class *pA 它指向壹個對象, 請問妳怎麽知道pA指向的是a對象還是b對象,這時如果有類型信息,我們就可以知道pA到底是什麽對象, 其實,它內部的實現原理是壹個字符串,所以,進行這個判斷時,實際上是字符串比較.

DECLARE_DYNCREATE是動態創建的意思.這個有點類似Com的類工廠.

它實際上是用類CRunTime class記錄了類的靜態創建函數的地址.這個特性在很多地方需要使用.就在下面說的DECLARE_SERIAL就是壹個經典的例子.

動態創建主要用在 我不知道要創建的對象就是是什麽類,但是我知道它肯定是從某個基類派生的.

DECLARE_SERIAL是指序列化特性,它是壹個完全自動化的存儲機制,它可以將壹個對象數組(可能含有A,B,C類的對象)存儲進去,而且能夠根據存儲的情況準確的載入進來,這看起來很簡單, 但是,有壹個問題我們必須考慮, 就是怎麽寫這個程序,使得載入的時候能夠正確創建相應的A,B,C類的對象呢(註意,這裏是三個不同的類).而且MFC的設計人員當初編寫這個機制的時候根本不知道到底會出現什麽類,也許還會出現D類. 怎麽辦呢?

可以肯定,存儲機制中必須要有能夠判斷類種類的代碼.所以,序列化機制DECLARE_SERIAL包含了DECLARE_DYNAMIC,這樣在存儲進入文件的時候,可以將類名稱存儲到文件中.

OK,我們載入的時候可以知道我們要載入什麽類了,但是,我們又要怎麽去創建它呢? 所以DECLARE_SERIAL也包含了DECLARE_DYNCREATE,它用於創建對象.

那麽,DECLARE_SERIAL到底有什麽特殊的地方呢?首先,它必須實現operator>>(具體原因可以看看深入淺出,還有版本控制,這樣,我們在處理序列化時,可以很靈活.

首先記住壹點,DECLARE_SERIAL最主要的用途是壹種智能存儲.所以我們可以不用這個智能特性.

當我們沒有DECLARE_SERIAL,而有void CMessg::Serialize(CArchive& ar)時,我們只能這樣進行存儲

CDocument::Serialize(ar)

{

if (ar.isstoring())

{

//存儲壹個對象

pMessg->Serialize(ar);

}

else

{

//必須非常明確的指出New壹個 CMessg對象;

pMessg = new CMessg;

pMessg->Serialize(ar);

}

}

在上面這個例子中,根本沒有利用MFC為我們設計的序列化只能機制.

再看下面壹個例子

CDocument::Serialize(ar)

{

if (ar.isstoring())

{

//存儲壹個對象

ar << pMessg;

}

else

{

//必須非常明確的指出New壹個 CMessg對象;

ASSERT(pMessg == NULL);

ar >> pMessg;

}

}