欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
序列化函數Serialize()
文檔數據保存到文件或從文件中讀取數據,都是通過(guò)序列化函數Serializ()實(shí)現的。
1.函數Serialize()的原理
 該函數的應用形式如下:
void CMyTestDoc::Serialize(CArchive& ar){
if(ar.IsStoring()){
ar<<m_Name<<m_Num;
}
else{
ar>>m_Name>>_Num;
}
}
函數Serialize()的參數ar是檔案類(lèi)CArchive的對象的引用,其包含一個(gè)CFile類(lèi)型的文件指針。CArchive對象為讀寫(xiě)
CFile對象中的可串行化數據提供了類(lèi)型安全緩沖機制。CArchive對象只能讀數據或寫(xiě)數據,而不能同時(shí)讀寫(xiě)數據。當保存數據到對象ar時(shí),該對象先將數據放至緩沖區中,直到緩沖區滿(mǎn),該對象才將數據寫(xiě)入文件指針指向的CFile對象中。當從對象ar讀數據時(shí),該對象從文件中讀取內容到緩沖區,然后再從緩沖區讀入到可串行化的對象中。該安全緩沖機制先集中在緩沖區中操作,減少了訪(fǎng)問(wèn)磁盤(pán)的次數,提高了不起應用程序的性能。
  ar保存了打開(kāi)文件的信息以及讀或寫(xiě)等信息。當向文件中寫(xiě)數據時(shí),執行ar.IsStoring(),操作符"<<"把數據存到ar定制的文件。當從文件讀數據時(shí),操作符">>"從文件中讀出數據,并初始化相關(guān)成員變量。
(ar是由應用程序框架完成初始化的.)
2.函數Serialize()的調用
當讀取文件或保存文件時(shí),都要發(fā)生文檔對象的序列化操作,即調用函數Serialize().
(1)讀取操作
<1>單擊應用程序菜單“File|New”,應用程序調用函數OnNewDocument()建立新文檔。OnNewDocument()調用虛函數DeleteContents()清空文檔類(lèi)數據成員,然后再調用SetModifiedFlag(FALSE)將文檔修改標志清除。
<2>單擊應用程序菜單"File|Open",應用程序調用函數OnOpenDocument()打開(kāi)已有文檔。函數OnOpenDocument()調用GetFile()獲取給定文件的CFile指針,再調用DeleteContents()函數清空文檔類(lèi)數據成員,然后把CFile指針構造CArchive對象交給Serialize函數完成讀文件重建文檔對象的工作,再調用SetModifiedFlag(FALSE)將文檔修改標志清除。其執行流程如圖:

 

(2)保存操作。
 單擊應用程序菜單“File|Save”或者“File|Save As”時(shí),應用程序調用函數OnSaveDocument()保存指定指定文件名的文檔。函數OnSaveDocument()詢(xún)問(wèn)文件名,調用函數GetFile()獲得給文件的CFile指針,再調用函數DeleteContents()清空文檔類(lèi)數據成員,接著(zhù)把CFile指針構造CArchive對象交給Serialize函數完成讀文件重建文檔對象的工作,最后調用SetModifiedFlag(FALSE)將文檔修改標志清除。其執行流程如圖:


(3)可序列化的數據類(lèi)型
(4)可序列化函數的局限性
一般情況下,序列化函數可以完成文檔數據的序列化操作,但是該函數也存在一定的局限性。
<1>序列化函數Serialize()只能順序讀寫(xiě)文件,而不能隨機操作。并且該函數只能一次性讀寫(xiě)全部文件,而不能讀取文件的部分內容。針對該限制,開(kāi)發(fā)人員可以通過(guò)獲取CFile指針,再調用CFile::Open(),CFile::Read(),CFile::Write()等函數,來(lái)支持隨機或部分讀寫(xiě)文件。
<2>序列化函數Serialize只能操作二進(jìn)制文件,不能處理文本文件,即利用該函數保存的文件不能像文本文件那樣個(gè)具有可讀性。類(lèi)CSdioFile可產(chǎn)生可讀性文件,在應用程序框架中可利用類(lèi)CStdioFile解決二進(jìn)制文件不可讀問(wèn)題。
<3>序列化函數Serialize()不支持數據文件操作,也不能共享操作文件。開(kāi)發(fā)人員可以通過(guò)重載虛函數OnOpenDocument(),OnNewDocument()和OnSaveDocument(), 并在這些虛函數內按數據庫訪(fǎng)問(wèn)接口編寫(xiě)讀寫(xiě)數據代碼來(lái)訪(fǎng)問(wèn)數據庫文件,而把對數據庫的操作和并發(fā)控制等任務(wù)交給數據庫管理系統處理。
(4)自定義可序列化類(lèi)
某類(lèi)只有派生自CObject且重定義了Serialize()函數才能實(shí)現序列化,MFC定義了兩個(gè)宏支持序列化,它們是DECLARE_SERIAL和IMPLEMENT_SERIAL.自定義一個(gè)可序列化類(lèi)的具體步驟如下:
<1>將類(lèi)的基類(lèi)定義為CObject或其派生類(lèi)
自定義的派生于CObject的類(lèi),可以訪(fǎng)問(wèn)CObject類(lèi)的基本序列化協(xié)議和功能。其代碼如下:
class CStudent::public CObject{
public:
CStudent();
virtual ~CStudent();
};
<2>覆蓋該類(lèi)的Serialize成員函數
序列化函數被定義在類(lèi)CObject中,其操作序列化描述對象當前狀態(tài)所必需的數據。成員函數Serialize的參數是一個(gè)CArchive對象的引用,用來(lái)讀寫(xiě)對象數據。
CArchive對象的成員函數IsStoring()用來(lái)表示序列化是存儲還是讀取。其具體代碼如下:
類(lèi)CStudent
//Student.h
class CStudent:public CObject{
public:
CString m_Name;
int m_Num;
...
void Serialize(CArchive& ar);
};
//Student.cpp
void CStudent::Serialize(CArchive& ar){
//調用基類(lèi)的Serialize()確保對象的繼承部分被序列化
CObject::Serialize(ar);
if(ar.IsStoring())
  ar<<m_Name<<m_Num;
else
  ar>>m_Name>>m_Num;
<3>在類(lèi)聲明中,添加DECLARE_SERIAL宏
在類(lèi)的聲明中,添加DECARE_SERIAL宏,以類(lèi)名為唯一參數,其代碼如下:
class CStudent:public CObject{
DECLARE_SERIAL(CStudent)
...
}
<4>定義不帶參數的構造函數
在類(lèi)的聲明中定義一個(gè)默認構造函數(不帶任何參數的構造函數)。一般情況下,添加類(lèi)時(shí)會(huì )自動(dòng)生成。當從數據文件讀入數據時(shí),應用程序框架需要一個(gè)默認構造函數對象。
(如果開(kāi)發(fā)人員沒(méi)有在使用宏的類(lèi)中定義默認的構造函數,編譯器會(huì )在宏IMPLEMENT_SERIAL所在的行警告沒(méi)有定義默認構造函數。)
<5>在類(lèi)的實(shí)現文件中,添加IMPLEMENT_SERIAL宏
 在類(lèi)的實(shí)現文件(.cpp文件)中,添加IMPLEMENT_SERIAL宏,它需要3個(gè)參數,分別是需要序列化的類(lèi)名。其基類(lèi)名及版本號。用于類(lèi)的數據成員或文檔數據在程序不同版本中可能不同,那么序列化內容也不同。如果保存的數據與讀取對象的版本數據不同,序列化操作會(huì )出現嚴重錯誤。因此,應用程序應該使用版本號,它代表了數據的組成和類(lèi)的結構?;鶎?shí)現代碼如下:
IMPLEMENT_SERIAL(CStudent,CObject,1) //讓此類(lèi)有序列化能力


本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
MFC序列化
串行化(Serialization)
MFC文檔序列化實(shí)現保存和加載
CArchive
VC序列化問(wèn)題(Serialize)
MFC的Serialize機制及其使用
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久