数据的序列化

上传人:hs****ma 文档编号:503701417 上传时间:2023-02-22 格式:DOCX 页数:11 大小:176.97KB
返回 下载 相关 举报
数据的序列化_第1页
第1页 / 共11页
数据的序列化_第2页
第2页 / 共11页
数据的序列化_第3页
第3页 / 共11页
数据的序列化_第4页
第4页 / 共11页
数据的序列化_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《数据的序列化》由会员分享,可在线阅读,更多相关《数据的序列化(11页珍藏版)》请在金锄头文库上搜索。

1、1.为什么要序列化回答:我们在开发基于单文档的SDI程序的时候,对于文档/视图机制中的数据交 换有了一定的了解。大体的流程是。文档类负责处理一些数据,然后通过调用 UpdateAllViews函数通知视图类。然后视图类通过获得指向文档类的指针,来 获取文档类的实时更新的数据,并且在相应的视图类里面调用相关函数完成一定 的功能。但是,我们始终没有触及到文档类与外部数据的机制,比如菜单里面的新建, 打开,保存等选项,这些选项就是用来与外部数据打交道的。那么,这样文档类 与外部数据到底该如何实现交换呢,以及当前程序里面的数据是否具有可持续功 能,这就要用到序列化的思想了。为了下面的讲解方便,我们仍然

2、采用上一讲的分割视图的范例程序 Ex_MultiView _交互2为该工程创建一个可序列化的类点击菜单中Insert -New Class,并且命名以及基类选择如下(必须选择 基类为CObject类)为新建的类添加成员变量以及支持序列化的相关功能。CStudent 类的头文件 Student.h class CStudent : public CObject public:CStudent(CString num,CString name,CString magor,CString home);CStudent();CStudent(CStudent &stu); void GetData(C

3、String &num,CString &name,CString &magor,CString &home);CStudent& operator=(CStudent stu); virtual CStudent(); DECLARE_SERIAL(CStudent); virtual void Serialize(CArchive &ar); private:CString m_strName;CString m_strNum;CString m_strMagor; CString m_strHome; ;CStudent 类的源文件 Student.cppIMPLEMENT_SERIAL

4、(CStudent,CObject,1)CStudent:CStudent() CStudent:CStudent(CString num,CString name,CString magor,CString home) m_strName = name; m_strNum = num; m_strMagor = magor; m_strHome = home;CStudent:CStudent(CStudent &stu) m_strName = stu.m_strName; m_strNum = stu.m_strNum; m_strMagor = stu.m_strMagor;m_str

5、Home = stu.m_strHome;void CStudent:GetData(CString &num,CString &name,CString&magor,CString &home)name = m_strName;num = m_strNum;magor = m_strMagor;home = m_strHome;CStudent& CStudent:operator=(CStudent stu)m_strName = stu.m_strName;m_strNum = stu.m_strNum;m_strMagor = stu.m_strMagor;m_strHome = st

6、u.m_strHome;return *this;void CStudent:Serialize(CArchive& ar)if (ar.IsStoring()arm_strNumm_strNamem_strMagorm_strNumm_strNamem_strMagorm_strHome;CStudent:CStudent()关于这个类中的的若干代码的解释:解释一:可序列化的类必须直接或间接从CObject派生。在类声明中,必须包括DECLARE_SERIAL宏调用。在类的实现文件中必须包括IMPLEMENT_SERIAL宏调用。解释二磁盘文件和归档(Archives):在MFC库中,磁盘文

7、件是通过CFile类的对象来表示的。如果应用程序不直接利用磁盘I/O,而只依赖于序列化处理过程,则可以避免直 接使用CFile对象。在serialize函数(序列化函数)与CFile对象之间,还有一个归档对象(CArchive 类对象),归档对象为CFile对象缓存数据,同时还保存一个内部标记,用来标 示归档存档(写盘)还是载入(读盘)。每次只能有一个活动的归档与文件相连。应用程序框架会很好管理CFile对象及 CArchive对象的创建,为CFile对象打开相应的磁盘文件,并且将相应的归档 对象与文件对象相连。关系图:持续文档对象 Serialize CArchive 对象 CFile对象磁

8、盘当用户选择了 File Open或File Save命令时,应用程序框架自动调用Serialize 函数。我们可以看到在本程序中,CStudent类的头文件Student.h中有一个虚函数 virtual void Serialize(CArchive &ar);就是这个函数实现数据与文件的归档 功能编写Serialize函数,实现下列数据的串行化处理m_strNum,m_strName,m_strMagor 和 m_strHomevoid CStudent:Serialize(CArchive& ar)if (ar.IsStoring()判断当前归档是被用来存入还是被用来载入的。arm_s

9、trNumm_strNamem_strMagorm_strNumm_strNamem_strMagorm_strHome;3.为该工程的文档类添加序列化的功能进入文档类的头文件#include #include Student.hclass CEx_MultiViewDoc : public CDocumentprotected: / create from serialization onlyCEx_MultiViewDoc();DECLARE_DYNCREATE(CEx_MultiViewDoc)/ Attributespublic:/CString Data4;int nIndex;BO

10、OL bAdd;CObArray m_StudentArray;省略部分代码;语句#include Student.h表示为文档类添加Cstudent的类声明语句CObArray m_StudentArray;表示为文档类添加一个对象指针数组类 CobArray的对象m_StudentArray用来保存相关的学生数据要使用这个类必须添加头文件Afxcoll.h进入文档类的实现文件,为序列化函数添加代码如下void CEx_MultiViewDoc:Serialize(CArchive& ar)if (ar.IsStoring()/ TODO: add storing code herem_St

11、udentArray.Serialize(ar);else/ TODO: add loading code herem_StudentArray.Serialize(ar);这样,文档类里面就有了一个可序列化的指针数组m_StudentArray,同学们 一定明白了,这个指针数组里面存放的就是相关的学生的数据,但是同学们一定 会问,这个可序列化的指针数组对象m_StudentArray和我们刚才建立的那个 可序列化的Cstudent类有什么关系呢?通过以下的几个步骤我们就会明白:对左侧表单视图类的单击提交按钮消息的消息响应函数做修改进入 LeftFormView.cpp 文件void CLef

12、tFormView:OnButtonChechin()/ TODO: Add your control notification handler code hereCEx_MultiViewDoc* pDoc =(CEx_MultiViewDoc*)GetDocument();UpdateData();if(m_Number.IsEmpty()|m_Name.IsEmpty()AfxMessageBox(姓名和学号不可以为空!);return;CStudent* stu = new Cstudent(m_Number,m_Name,pDoc-m_StudentArray.Add(stu);pD

13、oc-bAdd = TRUE;pDoc-UpdateAllViews(NULL);pDoc-SetModifiedFlag(TRUE);m_Number.Empty();m_Name.Empty();m_Magor.Empty();m_Home.Empty();UpdateData(FALSE);语句 CStudent* stu = new Cstudent(m_Number,m_Name, m_Magor,m_Home);的意思是从编辑框里面相应相关数据的输入并且生成相应的CStudent类的对象指针stu语句pDoc-m_StudentArray.Add(stu);的意思是获得文档类的指针

14、,将CStudent类的对象指针stu添加到文档类的对象指针数组类的对象里面去,也 就要说数组m_StudentArray里面的最后一个位置(基于0号索引)已经添加 了一个CStudent类的对象指针stu(也就是刚刚生成的一个新的学生的数据)。语句pDoc-SetModifiedFlag(TRUE);的意思是此时文档内容已经做了相应 修改,这样在退出该文档或者新建一个新的文档的时候,就会出现是否保存的提 示对右侧列表视图类的消息OnUpdate的消息响应函数做修改进入 RightListView.cppvoid CRightListView:OnUpdate(CView* pSender, LPARAM IHint, CObject* pHint)/ TODO: Add your specialized code here and/or call the base class/AfxMessageBox(OnUpdate);CEx_MultiViewDoc* pDoc =(CEx_MultiViewDoc*)GetDocument();CListCtrl& listctrl = GetListCtrl();listctrl.DeleteAllItems();int nCounts = pDoc-m_StudentArray.GetSize();CString name,num,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号