关键词不能为空

当前您在: 主页 > 英语 >

数据的序列化

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-03-03 12:54
tags:

-

2021年3月3日发(作者:6589)


1.



为什么要序列化



回答:



我们在开发基于单文档的


SDI


程序的时候,


对于文档


/


视图机制中的数据交


换有了一定的了解。大体的流 程是。文档类负责处理一些数据,然后通过调用


UpdateAllViews


函数通知视图类。


然后视图类通过获得指向文档类的指针,



获取文档类的实时更新的数据,


并且在相应的视图 类里面调用相关函数完成一定


的功能。



但是,


我们始终没有触及到文档类与外部数据的机制,


比如菜 单里面的新建,


打开,保存等选项,这些选项就是用来与外部数据打交道的。那么,这样 文档类


与外部数据到底该如何实现交换呢,


以及当前程序里面的 数据是否具有可持续功


能,这就要用到序列化的思想了。



为了下面的讲解方便,我们仍然采用上一讲的分割视图的范例程序



Ex_MultiView_


交互




2


为该工程创建一个可序列化的类



⑴点击菜单中


Insert



>New


Class


,并且命名以及基类选择如下(必须选择


基类为


CO bject


类)






⑵为新建的类添加成员变量以及支持序列化的相关功能。



CStudent


类的头文件


Studen t.h


class CStudent : public CObject




{


public:



CStudent(CString


num,CString


name,CString


magor,CString


home);



CStudent();



CStudent(CStudent &stu);



void


GetData(CString


&num,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


类的源文件




IMPLEMENT_SERIAL(CStudent,CObject,1)



CStudent::CStudent()


{


}



CStudent::CStudent(CString


num,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;


&name,CString


name,CString



m_strHome



= 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



= stu.m_strHome;



return *this;


}



void CStudent::Serialize(CArchive& ar)


{



if (ing())



{



< /p>


ar<



}



else



{




ar>>m_strNum>>m _strName>>m_strMagor>>m_strHome;



}


}



CStudent::~CStudent()


{


}



关于这个类中的的若干代码的解释:




解释一:



可序列化的类必须直接或间 接从


CObject


派生。



在类声明中,必须包括


DECLARE_SERIAL

< br>宏调用。



在类的实现文件中必须包括

< br>IMPLEMENT_SERIAL


宏调用。



解释二:



磁盘文件和归档(


Archives


):




MFC


库中,磁盘文件是通过


CF ile


类的对象来表示的。



如果应用 程序不直接利用磁盘


I/O



而只依赖 于序列化处理过程,


则可以避免直


接使用


CFile


对象。




serialize


函数


(序列化函数)

< p>


CFile


对象之间,


还有一个归档对象



CArchive


类对象)


,


归档对象为


CFile


对象缓存数据,同时还保存一个内部标记,用来标


示归档存档(写盘 )还是载入(读盘)。



每次只能有一个活动的归档与文件相连 。


应用程序框架会很好管理


CFile


对象及


CArchive


对象的创建,为


CFile


对象打开相应的磁盘文件,并且将相应的归档


对象 与文件对象相连。



关系图:



持续文档对象



<


--


> Serialize <


--


> CArchive


对象



<


--


> CFile


对象



<


--


>


磁盘



当用户选择了


File Open



File Save


命令时 ,


应用程序框架自动调用


Serialize

< br>函数。






我们可以看到在本程序中,


CStu dent


类的头文件


Student.h


中有一个虚函数



virtual


void


Serialize(CArchive


&ar);


就是这个函数实现数据与文件的归档


功能



编写


Serialize


函数,实现下列数据的串行化处理



m_st rNum



m_strName



m_strMagor



m_strHom e


void CStudent::Serialize(CArchive& ar)


{



if (ing())


判断当前归档是被用来存入还是被用来载入的。




{



< /p>


ar<



}



else



{




ar>>m_strNum>>m _strName>>m_strMagor>>m_strHome;



}


}









3.


为该工程的文档类添加序列化的 功能



⑴进入文档类的头文件



#include


#include


class CEx_MultiViewDoc : public CDocument


{


protected: // create from serialization only



CEx_MultiViewDoc();



DECLARE_DYNCREATE(CEx_MultiViewDoc)







// Attributes


public:





//CString Data[4];





int nIndex;





BOOL bAdd;








CObArray m_StudentArray;


//


省略部分代码



}




语句


#include


表示为文档类 添加


Cstudent


的类声明



语句


CObArray m_StudentArray;


表示为文档类添加一个对象指针数组类



C obArray


的对象


m_StudentArray


用来保存相关的学生数据



要使用这个类必须添加头文件


Afxcoll.h



⑵进入文档类的实现文件,为序列化函数添加代码如下



void CEx_MultiViewDoc::Serialize(CArchive& ar)


{



if (ing())



{




// TODO: add storing code here




m_ize(ar);



}



else



{




// TODO: add loading code here




m_ize(ar);



}


}




这样 ,文档类里面就有了一个可序列化的指针数组


m_StudentArray

< p>
,同学们


一定明白了,


这个指针数组里面存放的就 是相关的学生的数据,


但是同学们一定


会问,

< br>这个可序列化的指针数组对象


m_StudentArray

和我们刚才建立的那个


可序列化的


Cstudent


类有什么关系呢?通过以下的几个步骤我们就会明白:



-


-


-


-


-


-


-


-



本文更新与2021-03-03 12:54,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/700094.html

数据的序列化的相关文章

  • 余华爱情经典语录,余华爱情句子

    余华的经典语录——余华《第七天》40、我不怕死,一点都不怕,只怕再也不能看见你——余华《第七天》4可是我再也没遇到一个像福贵这样令我难忘的人了,对自己的经历如此清楚,

    语文
  • 心情低落的图片压抑,心情低落的图片发朋友圈

    心情压抑的图片(心太累没人理解的说说带图片)1、有时候很想找个人倾诉一下,却又不知从何说起,最终是什么也不说,只想快点睡过去,告诉自己,明天就好了。有时候,突然会觉得

    语文
  • 经典古训100句图片大全,古训名言警句

    古代经典励志名言100句译:好的药物味苦但对治病有利;忠言劝诫的话听起来不顺耳却对人的行为有利。3良言一句三冬暖,恶语伤人六月寒。喷泉的高度不会超过它的源头;一个人的事

    语文
  • 关于青春奋斗的名人名言鲁迅,关于青年奋斗的名言鲁迅

    鲁迅名言名句大全励志1、世上本没有路,走的人多了自然便成了路。下面是我整理的鲁迅先生的名言名句大全,希望对你有所帮助!当生存时,还是将遭践踏,将遭删刈,直至于死亡而

    语文
  • 三国群英单机版手游礼包码,三国群英手机单机版攻略

    三国群英传7五神兽洞有什么用那是多一个武将技能。青龙飞升召唤出东方的守护兽,神兽之一的青龙。玄武怒流召唤出北方的守护兽,神兽之一的玄武。白虎傲啸召唤出西方的守护兽,

    语文
  • 不收费的情感挽回专家电话,情感挽回免费咨询

    免费的情感挽回机构(揭秘情感挽回机构骗局)1、牛牛(化名)向上海市公安局金山分局报案,称自己为了挽回与女友的感情,被一家名为“实花教育咨询”的情感咨询机构诈骗4万余元。

    语文