中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

基于MFC如何實現類的序列化

發布時間:2022-07-12 10:20:16 來源:億速云 閱讀:196 作者:iii 欄目:開發技術

這篇文章主要介紹“基于MFC如何實現類的序列化”,在日常操作中,相信很多人在基于MFC如何實現類的序列化問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”基于MFC如何實現類的序列化”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

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

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

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

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

基于MFC如何實現類的序列化

將需要存取的類實現序列化 

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

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

2.為該類定義一個不帶參數的構造函數

基于MFC如何實現類的序列化

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.在類的實現中添加IMPLEMENT_SERIAL(類名,父類名,版本號)宏 

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

5.在類的實現中,通過類向導添加Serialize虛函數(也可也手寫)

基于MFC如何實現類的序列化

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

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

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

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

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

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

那么在 Serialize設置存取時可以安這樣

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

在程序啟動時加載序列化

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

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

從view類里拿到要序列化的數據people*

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

這樣我們每次保存時數據就可以以二進制序列化保存,每次打開時又可以打開上次保存的內容  

如果people*是一個數組的話,例如這樣

基于MFC如何實現類的序列化

那么我們在用序列化存取時就要先存取數組長度,再循環存取數組的內容 

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

到此,關于“基于MFC如何實現類的序列化”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

mfc
AI

洛阳市| 抚松县| 同德县| 分宜县| 华容县| 周至县| 郴州市| 常山县| 贵德县| 通山县| 浮山县| 景谷| 韩城市| 慈溪市| 淅川县| 阜阳市| 永和县| 虞城县| 依兰县| 开封县| 巴林右旗| 磐安县| 通山县| 武山县| 东台市| 扶绥县| 邵阳县| 开平市| 应城市| 龙泉市| 体育| 宜兰县| 上林县| 邹平县| 博客| 泽库县| 枣庄市| 故城县| 手机| 奉化市| 合川市|