• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            eryar

            PipeCAD - Plant Piping Design Software.
            RvmTranslator - Translate AVEVA RVM to OBJ, glTF, etc.
            posts - 603, comments - 590, trackbacks - 0, articles - 0

             

            Writing Serializable Classes

            定義可序列化的類

            盡管MFCCFile類使文件的讀寫(xiě)變得相當(dāng)容易,但是通常MFC程序都不直接使用CFile對(duì)象。相反地,他們使用CArchive類來(lái)實(shí)現(xiàn)文件的讀寫(xiě),CArchive類最終還是通過(guò)CFile類來(lái)實(shí)現(xiàn)文件輸入/輸出。MFC得載了 <<>> 操作符來(lái)實(shí)現(xiàn)數(shù)據(jù)的進(jìn)、出,主要是因?yàn)槌绦蛲ǔR彩菍?shù)據(jù)存入或?qū)?shù)據(jù)取出。

            SerializationMFC中一個(gè)重要概念,因?yàn)樗?strong>MFC在文檔/視的程序中實(shí)現(xiàn)打開(kāi)和保存文件的基礎(chǔ)。

            定義可序列化的類

            一個(gè)對(duì)象若要支持可序列化,它必須是可序列化類的實(shí)例。定義一個(gè)可序列化的類分為以下五步:

            1. 使該類直接或間接繼承類CObject
            2. 在類聲明中包含MFC的宏DECLARE_SERIALDECLARE_SERIAL只要一個(gè)參數(shù):類名;
            3. 重載基類的Serialize函數(shù),并序列化繼承類的成員數(shù)據(jù);
            4. 若繼承類沒(méi)有默認(rèn)構(gòu)造函數(shù),添加之。這步是必須的,因?yàn)楫?dāng)一個(gè)對(duì)象載入時(shí),MFC使用默認(rèn)構(gòu)造函數(shù)創(chuàng)建一個(gè)對(duì)象,并用文件中的數(shù)據(jù)來(lái)初始化對(duì)象的成員函數(shù);
            5. 在類的實(shí)現(xiàn)中包含MFC的宏IMPLEMENT_SERIAL。宏IMPLEMENT_SERIAL需要三個(gè)參數(shù):類名、基類名和模式號(hào)(schema number)。模式號(hào)是一個(gè)整數(shù),表示一個(gè)版本號(hào)。

            實(shí)例

            假設(shè)你定義了一個(gè)類CLine來(lái)表示直線,類有兩個(gè)CPoint的成員變量來(lái)存儲(chǔ)直線的端點(diǎn),你想使這個(gè)類支持序列化。原始的類聲明如下:

               1:  class CLine
               2:  {
               3:  protected:
               4:      CPoint m_ptFrom;
               5:      CPoint m_ptTo;
               6:   
               7:  public:
               8:      CLine (CPoint from, CPoint to) { m_ptFrom = from; m_ptTo = to; }
               9:  };

            使該類支持序列化很容易,如下代碼為添加序列化功能的類聲明:

               1:  class CLine : public CObject
               2:  {
               3:  DECLARE_SERIAL (CLine)
               4:   
               5:  protected:
               6:      CPoint m_ptFrom;
               7:      CPoint m_ptTo;
               8:   
               9:  public:
              10:      CLine () {} // Required!
              11:      CLine (CPoint from, CPoint to) { m_ptFrom = from; m_ptTo = to; }
              12:      void Serialize (CArchive& ar);
              13:  };
              14:   

            重載的序列化函數(shù)如下所示:

            void CLine::Serialize (CArchive& ar)
            {
                CObject::Serialize (ar);
                if (ar.IsStoring ())
                    ar << m_ptFrom << m_ptTo;
                else // Loading, not storing
                    ar >> m_ptFrom >> m_ptTo;
            }
             

            最后在類的實(shí)現(xiàn)文件中添加下面的宏即可:

               1:  IMPLEMENT_SERIAL (CLine, CObject, 1)

            通過(guò)這些修改,這個(gè)類是完全支持可序列化的。


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            国内精品久久国产大陆| 中文字幕久久亚洲一区| 久久精品毛片免费观看| 久久影视国产亚洲| 国产午夜福利精品久久| 中文字幕久久亚洲一区| 久久久久久久97| 久久精品三级视频| 国产精品热久久无码av| 偷偷做久久久久网站| 欧美精品丝袜久久久中文字幕| 国内精品久久国产| 久久九九久精品国产免费直播| 99精品国产综合久久久久五月天| 中文字幕无码久久久| 国产精品视频久久| 精品久久久久久无码人妻热 | 国产精品久久久久免费a∨| 国产成人无码久久久精品一| 久久久久久久91精品免费观看| 欧美日韩成人精品久久久免费看| 精品多毛少妇人妻AV免费久久| 久久精品国产亚洲AV高清热 | 丁香狠狠色婷婷久久综合| 亚洲人成伊人成综合网久久久| 日韩十八禁一区二区久久| 国产精品99久久久久久www| 国产精品久久久久天天影视| 国产精品99久久99久久久| 久久永久免费人妻精品下载| .精品久久久麻豆国产精品 | 婷婷久久五月天| 无码精品久久一区二区三区| 久久国产成人午夜AV影院| 国产香蕉97碰碰久久人人| 亚洲精品高清久久| 久久只有这里有精品4| 久久亚洲国产最新网站| 久久亚洲精品国产亚洲老地址 | 国产精品18久久久久久vr | 亚洲国产精品高清久久久|