基於MFC實現類的序列化詳解
序列化是將程序中的對象以一種二進制格式存儲到存儲設備中(例如文本/數據庫等),以實現“永生”或隨意“流動”
首先定義一個要序列化的類people,其屬性有age、weight、height。
#pragma once class people { public: int age; int weight; int height; };
定義好後將該類添加到 項目名view.h 的類中,作為其屬性,並且是指針類型
將需要存取的類實現序列化
1.序列化的類必須從CObject派生,或是從CObject的派生類派生
#pragma once //導入#include<afx.h>頭文件,使類能繼承CObject #include<afx.h> class people :public CObject { public: int age; int weight; int height; };
2.為該類定義一個不帶參數的構造函數
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提供瞭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*是一個數組的話,例如這樣
那麼我們在用序列化存取時就要先存取數組長度,再循環存取數組的內容
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實現類的序列化詳解的文章就介紹到這瞭,更多相關MFC類的序列化內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!