Visual C++串行化編程
天極IT資訊短信服務 電腦小技巧 資費:包月5元 手機: 介紹:細處著手,巧處用功。高手和菜鳥之間的差別就是:高手什么都知道,菜鳥知道一些。電腦小技巧收集最新奇招高招,讓你輕松踏上高手之路。(首月免費) 串行化是微軟提供的用于對對象進行文件I/O的一種
天極IT資訊短信服務 電腦小技巧 | 介紹:細處著手,巧處用功。高手和菜鳥之間的差別就是:高手什么都知道,菜鳥知道一些。電腦小技巧收集最新奇招高招,讓你輕松踏上高手之路。(首月免費) | |
串行化是微軟提供的用于對對象進行文件I/O的一種機制,該機制在框架(Frame)/文檔(Document)/視圖(View) 模式中得到了很好的應用。很多人對什么是串行化、怎么使對象具有串行化能力和如何使用串行化功能等問題都不甚明了。本文試圖對串行化做一個簡單的解釋。由于本人對串行化功能使用的也不多,不足之處敬請諒解。
MFC 框架/文檔/視圖結構中的文件讀寫
CFile是MFC類庫中所有文件類的基類。所有MFC提供的文件I/O功能都和這個類有關。很多情況下,大家都喜歡直接調用CFile::Write/WriteHuge來寫文件,調用CFile::Read/ReadHuge來讀文件。這樣的文件I/O其實和不使用MFC的文件
I/O沒有什么區別,甚至和以前的ANSI C的文件I/O也沒有多少差別,所差別的不外乎是調用的API不同而已。
在開始學習
C++的時候,大家一定對cin/cout非常熟悉,這兩個對象使用非常明了的<<和>>運算符進行 I/O,其使用格式為:
//示例代碼1
int i;
cin >> i;
//here do something to object i
cout << i; |
使用這種方式進行I/O的好處時,利用運算符重載功能,可以用一個語句完成對一系列的對象的讀寫,而不需要區分對象具體的類型。MFC提供了類CArchive,實現了運算符<<和>>的重載,希望按照前面cin和cout
的方式進行文件I/O。通過和CFile類的配合,不僅僅實現了對簡單類型如int/float等的文件讀寫,而且實現了對可序列化對象(Serializable
Objects,這個概念后面描述)的文件讀寫。
一般情況下,使用CArchive對對象進行讀操作的過程如下:
//示例代碼2
//定義文件對象和文件異常對象
CFile file;
CFileException fe;
//以讀方式打開文件
if(!file.Open(filename,CFile::modeRead,&fe))
{
fe.ReportError();
return;
}
//構建CArchive 對象
CArchive ar(&file,CArchive::load);
ar >> obj1>>obj2>>obj3...>>objn;
ar.Flush();
//讀完畢,關閉文件流
ar.Close();
file.Close(); |
使用CArchive對對象進行寫操作的過程如下:
//示例代碼3
//定義文件對象和文件異常對象
CFile file;
CFileException fe;
//以讀方式打開文件
if(!file.Open(filename,CFile::modeWrite|CFile::modeCreate,&fe))
{
fe.ReportError();
return;
}
//構建CArchive 對象
CArchive ar(&file,CArchive::load);
ar << obj1<<obj2<<obj3...<<objn;
ar.Flush();
//寫完畢,關閉文件流
ar.Close();
file.Close(); |
可見,對于一個文件而言,如果文件內對象的排列順序是固定的,那么對于文件讀和寫從形式上只有使用的運算符的不同。在MFC的框架/文檔/視圖結構中,一個文檔的內部對象的構成往往是固定的,這種情況下,寫到文件中時對象在文件中的布局也是固定的。因此CDocument利用其基類CObject提供的Serilize虛函數,實現自動文檔的讀寫。