最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于MFC實現(xiàn)類的序列化詳解

 更新時間:2022年07月09日 08:34:13   作者:霸道小明  
序列化是將程序中的對象以一種二進制格式存儲到存儲設(shè)備中(例如文本/數(shù)據(jù)庫等),以實現(xiàn)“永生”或隨意“流動”。本文將為大家詳細講講如何基于MFC實現(xiàn)類的序列化,需要的可以參考一下

序列化是將程序中的對象以一種二進制格式存儲到存儲設(shè)備中(例如文本/數(shù)據(jù)庫等),以實現(xiàn)“永生”或隨意“流動”

首先定義一個要序列化的類people,其屬性有age、weight、height。

#pragma once
 
 
class people {
public:
    int age;
    int weight;
    int height;
};

定義好后將該類添加到  項目名view.h  的類中,作為其屬性,并且是指針類型

將需要存取的類實現(xiàn)序列化 

1.序列化的類必須從CObject派生,或是從CObject的派生類派生

#pragma once
//導(dǎo)入#include<afx.h>頭文件,使類能繼承CObject
#include<afx.h>
 
 
class people :public CObject {
 
public:
    int age;
    int weight;
    int height;
};

2.為該類定義一個不帶參數(shù)的構(gòu)造函數(shù)

3.在類聲明中使用DECLARE_SERIAL(類名)宏

#pragma once
#include<afx.h>
 
 
class people :public CObject {
public:
    DECLARE_SERIAL(people);
    people();
public:
    int age;
    int weight;
    int height;
};

4.在類的實現(xiàn)中添加IMPLEMENT_SERIAL(類名,父類名,版本號)宏 

#include "pch.h"
#include "people.h"
 
//第一個參數(shù)是類的名字,第二個參數(shù)是父類名字,第三個參數(shù)是版本號(一般版本號從1開始)
IMPLEMENT_SERIAL(people, CObject, 1);
 
people::people()
{
}

5.在類的實現(xiàn)中,通過類向?qū)砑覵erialize虛函數(shù)(也可也手寫)

MFC提供了CArchive類可以將對象數(shù)據(jù)保存到永久設(shè)備,比如磁盤文件。當應(yīng)用程序重新啟動后,CArchive類可以幫助我們從磁盤文件讀取這些數(shù)據(jù),然后在內(nèi)存中重新構(gòu)建對應(yīng)的對象;這樣就使得我們的對象數(shù)據(jù)永久存在,該過程稱之為序列化(或者串行化)。 

void people::Serialize(CArchive& ar)
{
    if (ar.IsStoring())
    {    // storing code
    }
    else
    {    // loading code
    }
}

CArchive類重載了輸入輸出運算符,在存取時就是利用運算符重載

void people::Serialize(CArchive& ar)
{
    if (ar.IsStoring())
    {    // storing code
        //存數(shù)據(jù)
        ar << age << weight << height;
    }
    else
    {    // loading code
        //讀數(shù)據(jù)
        ar >> age >> weight >> height;
    }
}

如果說類的屬性中有自定義類型的數(shù)組,比如下面這種,其中CPoint是MFC類型對象

#pragma once
#include<afx.h>
 
 
class people :public CObject {
public:
    CArray<CPoint>m_point;
};

那么在 Serialize設(shè)置存取時可以安這樣

void people::Serialize(CArchive& ar)
{
    if (ar.IsStoring())
    {    // storing code
        //存數(shù)據(jù)
        ar << age << weight << height;
    }
    else
    {    // loading code
        //讀數(shù)據(jù)
        ar >> age >> weight >> height;
    }
    /*直接使用數(shù)組調(diào)用該方法,因為數(shù)組已經(jīng)實現(xiàn)了這個方法,數(shù)組存放的元素是CPoint,CPoint
      本省也是支持序列化*/
    m_point.Serialize(ar);
}

在程序啟動時加載序列化

在Doc.cpp文件中找到序列化接口函數(shù)

void Cdraw3Doc::Serialize(CArchive& ar)
{
    if (ar.IsStoring())
    {
        // TODO: 在此添加存儲代碼
    }
    else
    {
        // TODO: 在此添加加載代碼
    }
}

從view類里拿到要序列化的數(shù)據(jù)people*

void Cdraw3Doc::Serialize(CArchive& ar)
{
    //取出第一個view在鏈表中的位置
    POSITION pos = GetFirstViewPosition();
    //通過位置獲得該view 
    Cdraw3View* pView = (Cdraw3View* )GetNextView(pos);
    if (ar.IsStoring())
    {
        //存數(shù)據(jù)
        ar << pView->human;
    }
    else
    {
        //取數(shù)據(jù)
        ar >> pView->human;
    }
}

這樣我們每次保存時數(shù)據(jù)就可以以二進制序列化保存,每次打開時又可以打開上次保存的內(nèi)容  

如果people*是一個數(shù)組的話,例如這樣

那么我們在用序列化存取時就要先存取數(shù)組長度,再循環(huán)存取數(shù)組的內(nèi)容 

void Cdraw3Doc::Serialize(CArchive& ar)
{
    //取出第一個view在鏈表中的位置
    POSITION pos = GetFirstViewPosition();
    //通過位置獲得該view 
    Cdraw3View* pView = (Cdraw3View* )GetNextView(pos);
    //獲得數(shù)組長度
    int cnt = pView->human.GetSize();
    if (ar.IsStoring())
    {
        //存數(shù)據(jù)
        ar << cnt;
        for (int i = 0; i < cnt; i++) {
            //循環(huán)存儲數(shù)組
            ar << pView->human.GetAt(i);
        }
    }
    else
    {
        //取長度
        ar >> cnt;
        for (int i = 0; i < cnt; ++i) {
            //依次取數(shù)據(jù),加入到數(shù)組中
            people* p;
            ar >> p;
            pView->human.Add(p);
        }
        
    }
}

到此這篇關(guān)于基于MFC實現(xiàn)類的序列化詳解的文章就介紹到這了,更多相關(guān)MFC類的序列化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言實現(xiàn)員工工資管理系統(tǒng)

    C語言實現(xiàn)員工工資管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)員工工資管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C++中的auto_ptr智能指針的作用及使用方法詳解

    C++中的auto_ptr智能指針的作用及使用方法詳解

    這篇文章主要介紹了C++中的auto_ptr智能指針的作用及使用方法詳解的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-07-07
  • C語言實現(xiàn)冒泡排序算法的示例詳解

    C語言實現(xiàn)冒泡排序算法的示例詳解

    這篇文章主要介紹了C語言如何實現(xiàn)冒泡排序算法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • c語言單鏈表尾添加的深入講解

    c語言單鏈表尾添加的深入講解

    這篇文章主要給大家介紹了關(guān)于c語言單項鏈表尾添加的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 帶你了解C++初階之引用

    帶你了解C++初階之引用

    這篇文章主要為大家介紹了C++初階之引用,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • C語言程序環(huán)境編譯+鏈接理論

    C語言程序環(huán)境編譯+鏈接理論

    這篇文章主要介紹了C語言程序環(huán)境編譯+鏈接理論,下面文章基于C語言的相關(guān)資料展開對編譯和鏈接的詳細介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-04-04
  • C語言實現(xiàn)逆波蘭式實例

    C語言實現(xiàn)逆波蘭式實例

    這篇文章介紹了C語言實現(xiàn)逆波蘭式實例,有需要的朋友可以參考一下
    2013-09-09
  • C語言實現(xiàn)雙人五子棋游戲

    C語言實現(xiàn)雙人五子棋游戲

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)雙人五子棋游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 淺談C++對象的內(nèi)存分布和虛函數(shù)表

    淺談C++對象的內(nèi)存分布和虛函數(shù)表

    下面小編就為大家?guī)硪黄獪\談C++對象的內(nèi)存分布和虛函數(shù)表。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • C語言實現(xiàn)飛機游戲(2)

    C語言實現(xiàn)飛機游戲(2)

    這篇文章主要介紹了C語言實現(xiàn)飛機游戲的第二部分,進行功能完善,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05

最新評論

新化县| 武平县| 巩留县| 桂平市| 股票| 永和县| 周口市| 鸡东县| 正阳县| 道真| 监利县| 柳河县| 调兵山市| 临城县| 平舆县| 图片| 东乡族自治县| 若羌县| 文昌市| 出国| 博爱县| 新乡市| 乡城县| 习水县| 临洮县| 凤凰县| 朝阳市| 大港区| 淄博市| 阳高县| 陆丰市| 米易县| 勃利县| 英山县| 玉龙| 汕尾市| 桦甸市| 筠连县| 海伦市| 定日县| 通河县|