1. 程式人生 > 其它 >MFC序列化及反序列化物件

MFC序列化及反序列化物件

技術標籤:MFCMFC序列化反序列化物件

總有一天你會明白什麼是愛,當你坐車來回幾百公里去看一個人的時候,在路上你就會明白。。。

---- 網易雲熱評

一、序列化類物件

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)。

歡迎關注公眾號:順便編點程