MFC序列化及反序列化物件
阿新 • • 發佈:2021-01-02
總有一天你會明白什麼是愛,當你坐車來回幾百公里去看一個人的時候,在路上你就會明白。。。
---- 網易雲熱評
一、序列化類物件
1、使用方法:必須滿足下面四個條件
類必須派生CObject
類內必須新增宣告巨集DECLARE_SERIAL
類外必須新增實現巨集IMPLEMENT_SERIAL
類必須重寫CObject::Serialize虛擬函式
class Student :public CObject {
//宣告巨集
DECLARE_SERIAL(Student)
public:
//建構函式
Student(int age = 0, float score= 0.0, CString name = ""):
m_age(age), m_score(score), m_name(name){}
//成員變數
int m_age;
float m_score;
CString m_name;
virtual void Serialize(CArchive& ar);
};
//實現巨集
IMPLEMENT_SERIAL(Student, CObject, 1)
//重寫函式
void Student::Serialize(CArchive& ar) {//此函式的this為&s
if (ar.IsLoading()) {
ar >> m_age >> m_score >> m_name;
}
else {
ar << m_age << m_score << m_name;
}
}
2、序列化物件
利用CFile::Open建立並開啟一個硬碟檔案
定義CArchive類物件例如:CArchivear(..);
利用<<實現序列化類物件到ar維護buff中
關閉CArchive類物件
關閉檔案
int main() {
CFile file;
file.Open("e:/a.txt", CFile::modeCreate | CFile::modeWrite);
CArchive ar(&file, CArchive::store, 4096);
Student s(18, 888.5, "aiyou");
ar << &s;
ar.Close();//ar快取區資料導在硬碟上,釋放ar快取區
file.Close();
return 0;
}
3、序列化類物件過程
首先將物件的類的相關資訊(類名,類大小,類版本)序列化到ar維護buff中。
利用類物件呼叫成員虛擬函式Serialize,將物件的各個成員變數序列化到ar維護buff中。
當關閉ar物件時,將ar維護的buff中的剩餘資料存入硬碟檔案,將ar維護的buff釋放。
二、反序列化物件
1、反序列化類物件
利用CFile::Open 開啟一個硬碟檔案
定義CArchive類物件例如 :CArchive ar(..);
利用 >> 實現反序列化類物件。
關閉CArchive類物件
關閉檔案
CFile file;
file.Open("e:/a.txt", CFile::modeRead);
CArchive ar(&file, CArchive::load, 4096);
Student* pStu = NULL;
ar >> pStu;
printf("年齡:%d,成績:%f,姓名:%s\n", pStu->m_age, pStu->m_score,
pStu->m_name);
ar.Close();
file.Close();
2、反序列化類物件過程
首先將類的相關資訊(類名等)反序列化到ar維護buff中
利用類名找到動態建立機制的靜態變數。
利用靜態變數呼叫加工廠函式,動態建立類對
利用物件呼叫成員虛擬函式Serialize,將“年齡等”資訊,儲存到物件各個成員變數中。
將動態建立的物件的地址賦值給我們定義空指標(pStu)。
歡迎關注公眾號:順便編點程