当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 串行化(Serialization)

VC++
关于win32 programming中的视口和窗口!
VC 下加载 JPG / JPEG / GIF / PNG 图片最简单的方法
个人VC串口通信经验及相关知识总结
VC++ 内存机理的个人理解:堆和栈
理解VC++里字符串类型的真正含义
VC++ 实现全屏
VC++ 6.0的小花招
VC++快捷键
VC中的一些调试技巧
由MessageBox透视Win API的调用
VC-文本框只能输入数字和小数 源文件
C 基础:C 类成员属性的一种简洁实现
vc中bool与BOOL的区别
C++和Java的区别
VC++6.0 下搭建 wxWidgets 开发环境
VC6做简易自动升级程序
VC++ 6.0的小花招
VC++程序调试
VC++ 捕捉摄像头视频
VC++的Unicode编程

VC++ 中的 串行化(Serialization)


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 158 ::
收藏到网摘: n/a

串行化(Serialization)

作者:阿荣


下载例子源代码


串行化是微软提供的用于对对象进行文件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	CArchive loadArchive(pFile, CArchive::load | CArchive::bNoFlushOnDelete);	loadArchive.m_pDocument = this;	loadArchive.m_bForceFlat = FALSE;	TRY	{	CWaitCursor wait;	if (pFile->GetLength() != 0)