內容提要:本文以簡單的例子介紹在Visual C++編程中數據讀寫的基本方法和可序列化類的實現,并簡單介紹了Visual C++中序列化的使用。
數據讀寫是應用程序中必不可少的一部分,Visual C++中數據的讀寫當然也十分重要,因此VisualC++在MFC中對數據的讀寫創造了十分好的支持,這使得我們可以十分方便的實現我們對數據讀寫操作的需要。
MFC 為數據讀寫設計了三個基本的類--CFile(文件類)、CStdioFile(標準I/O文件類)、CArchive(文檔類)。其中標準I/O文件類提供相當于C的流式文件的功能,可以用文本或者二進制方式打開,可以被緩沖。文件類提供了非緩沖的二進制輸入輸出文件,它既可以與文檔類結合實現VisualC++設計中常用的文件序列化,也可以由設計者自己訂制存儲方案,實現數據的讀寫操作(此方法的兼容問題需要解決,保密性強)。文檔類是VisualC++程序設計中最常用的文件處理的方法,文檔類可以方便的實現VisualC++中大多數數據類型的讀寫操作。
文檔類不僅可以實現簡單數據結構的讀寫操作,還可以通過對CObiect類的派生實現對復雜數據結構的讀寫操作,由于該方法是VisualC++程序設計的基本方法,本文就以一個簡單的例子來介紹可序列化類的實現方法。
實現條件:
實現序列化的的類需要滿足一系列條件:
1. 該類需要從CObject類派生(可以是間接派生);
2. 在類中中進行DECLARE_SERIAL宏定義;
3. 類存在有缺省的構造函數;
4. 類中實現了Serialize()函數,并且在其中調用基類的序列化函數;
5. 使用IMPLEMENT_SERIAL宏指明類名及版本號;
下面是我在學習Windows程序設計課程是實現的一個程序的一個類的部分代碼,為了方便,刪去了與本文無關的函數及部分語句并添加了一點注解。
class CMapVertex : public CObject//實現序列化的類一般由CObject派生 { DECLARE_SERIAL(CMapVertex)//序列化一般會需要進行DECLARE_SERIAL宏定義 public: CMapVertex();//實現序列化需要有缺省的構造函數 void Serialize(CArchive &ar); CMap<unsigned,unsigned&,float,float&> m_pre; //其它數據及函數的聲明 CMapVertex* next; }; IMPLEMENT_SERIAL(CMapVertex,CObject,0)//序列化類一般需要指明類名及版本號 //其它函數的定義 void CMapVertex::Serialize(CArchive &ar) { if(ar.IsStoring()) { //其它數據寫操作 } else { //其它數據讀操作 } m_pre.Serialize(ar);// MFC已經為集合類實現了序列化可以調用序列化函數 CObject:: Serialize(ar); //實現序列化的類一般需要在序列化函數中調用其基類的序列化函數 }////////////////////////////////////////////////////////////////////// class CMyMap : public CObject { DECLARE_SERIAL(CMyMap) public: CMapVertex* m_TopVertex; UINT m_VertexNum;//記錄鏈表中的元素數目 CMyMap(); void Serialize(CArchive&ar); //其它數據及函數的聲明 }; IMPLEMENT_SERIAL(CMyMap,CObject,0) //其它函數的定義 void CMyMap::Serialize(CArchive &ar) { CMapVertex*temp=m_TopVertex; if(ar.IsStoring()) { ar<<m_VertexNum;//讀取時需要先知道元素的個數,所以先保存m_VertexNum for(UINT i=0;i<m_VertexNum;i++) { temp->Serialize(ar); temp=temp->next; } //其它數據寫操作 } else { ar>>m_VertexNum; if(m_VertexNum!=0) { temp=m_TopVertex=new CMapVertex; //鏈表中的元素需要在堆中進行分配內存空間,析構時會釋放空間 m_TopVertex->Serialize(ar); } for(UINT i=1;i<m_VertexNum;i++) { temp->next=new CMapVertex; temp=temp->next;//用缺省函數構造的節點的next為NULL temp->Serialize(ar);//CMapVertex類已實現序列化 } //其它數據讀操作 } CObject:: Serialize(ar); } |
原文轉自:http://www.anti-gravitydesign.com