串行化(Serialization)

2016-01-29 12:23 3 1 收藏

串行化(Serialization),串行化(Serialization)

【 tulaoshi.com - C语言心得技巧 】

串行化(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,这个概念后面描述)的文件读写。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)

一般情况下,使用CArchive对对象进行读操作的过程如下:

                //示例代码2        //定义文件对象和文件异常对象        CFile file;        CFileException fe;        //以读方式打开文件        if(!file.Open(filename,CFile::modeRead,&fe))        {                fe.ReportError();                return;        }                //构建CArchive 对象        CArchive ar(&file,CArchive::load);        ar  obj1obj2obj3...objn;        ar.Flush();        //读完毕,关闭文件流        ar.Close();        file.Close();

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)

使用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)
                        

来源:https://www.tulaoshi.com/n/20160129/1485898.html

延伸阅读
以往的DOS系统是通过DOS中断和BIOS中断向用户提供串行接口的通讯能力。在Windows环境下,C++的开发工具既没有提供象DOS和BIOS中那样专门的串行通讯控制方法,也不答应用户直接控制串口的中断。 为了保证资源共享,Windows系统完全接管了各种硬件资源,使用中断来控制端口将破坏系统的多任务性,使系统的稳定性受到影响。但Windows...
标签: Java JAVA基础
串行通讯慨述 串行通讯协议有很多种,像RS232,RS485,RS422,甚至现今流行的USB等都是串行通讯协议。而串行通讯技术的应用无处不在。可能大家见的最多就是电脑的串口与Modem的通讯。记得在PC机刚开始在中国流行起来时(大约是在90年代前五年),那时甚至有人用一条串行线进行两台电脑之间的数据共享。除了这些,手机,PD...
用C++Builder在Win9x下开发串行通信程序是程序员们经常遇到却又令人头痛的事情,不但要理解许多复杂的API函数,还要掌握多线程编程。令人欣慰的是有一些公司专门为C++Builder开发了编写串行通信程序的开发工具,例如MOXA公司的Pcomm(该软件可在http:\www.moxa.com.tw下载),因而帮我们解决了串行编程这一难题。 ----下面结合一个具...
标签: SQLServer
  SQL的数据类型决定了一个字段的内容在数据库中会被如何处理、存储和显示。SQL92定义了标准的数据类型,目的是给数据库制造商建立自己的数据类型提供蓝图。在前面的文章中,我们介绍了一些常用的数据类型,这些数据类型分为四大类: 串行 数值 日期时间 区间型    本文将向你概述这些数据类型在数据库中是如何使用的,然后着重...
随着Windows在国内的普及,特别是Windows95的推出,越来越多的微机用户转向了Windows操作系统。不过Windows应用软件的开发对于一般工程技术领域的技术人员来说并非易事,不但Windows的消息循环机制不易理解,而且要开发一个功能强、界面美观的应用软件,其编程和调试的工作量是非常大的。许多并非搞软件出身的工程技术人员对Windows编程望而生畏...

经验教程

629

收藏

8
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部