VisualC 串行化编程
2008-04-09 04:09:10来源:互联网 阅读 ()
介绍:细处着手,巧处用功。高手和菜鸟之间的差别就是:高手什么都知道,菜鸟知道一些。电脑小技巧收集最新奇招高招,让你轻松踏上高手之路。(首月免费)
串行化是微软提供的用于对对象进行文件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虚函数,实现自动文档的读写。
当用户在界面上选择文件菜单/打开文件(ID_FILE_OPEN)时,CWinApp派生类的OnFileOpen函数被自动调用,它通过文档模板创建(MDI)/重用(SDI)框架、文档和视图对象,并最终调用CDocument::OnOpenDocument来读文件,CDocument::OnOpenDocument 的处理流程如下:
//示例代码4
BOOL CDocument::OnOpenDocument(LPCTSTR lpszPathName)
{
if (IsModified())
TRACE0("Warning: OnOpenDocument replaces an unsaved document.\n");
CFileException fe;
CFile* pFile = GetFile(lpszPathName,
CFile::modeRead|CFile::shareDenyWrite, &fe);
if (pFile == NULL)
{
ReportSaveLoadException(lpszPathName, &fe,
FALSE, AFX_IDP_FAILED_TO_OPEN_DOC);
return FALSE;
}
DeleteContents();
SetModifiedFlag(); // dirty during de-serialize
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:VisualC 编程中的文件操作
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash