VC程序設計中可序列化類的實現

發表于:2007-04-27來源:作者:點擊數: 標簽:序列化中可內容提要程序設計實現
內容提要: 本文以簡單的例子介紹在Visual C++編程中數據讀寫的基本方法和可序列化類的實現,并簡單介紹了Visual C++中序列化的使用。 數據讀寫是應用程序中必不可少的一部分,Visual C++中數據的讀寫當然也十分重要,因此VisualC++在MFC中對數據的讀寫創造

  內容提要:本文以簡單的例子介紹在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);
}

共2頁。 1 2 8 :

原文轉自:http://www.anti-gravitydesign.com

評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
...
国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97