中华网通行证
用户名 密码
  科技动态 硬件广场 下载基地 网络教室 网络冲浪 科学博览 移动时代 手机上网 桌面壁纸 科技商情  

3.5 利用序列化进行文件读写

在很多应用中我们需要对数据进行保存,或是从介质上读取数据,这就涉及到文件的操作。我们可以利用各种文件存取方法完成这些工作,但MFC中也提供了一种读写文件的简单方法——“序列化”。序列化机制通过更高层次的接口功能向开发者提供了更利于使用和透明于字节流的文件操纵方法,举一个例来讲你可以将一个字串写入文件而不需要理会具体长度,读出时也是一样。你甚至可以对字符串数组进行操作。在MFC提供的可自动分配内存的类的支持下你可以更轻松的读/写数据。你也可以根据需要编写你自己的具有序列化功能的类。

序列化在最低的层次上应该被需要序列化的类支持,也就是说如果你需要对一个类进行序列化,那么这个类必须支持序列化。当通过序列化进行文件读写时你只需要该类的序列化函数就可以了。

怎样使类具有序列化功能呢?你需要以下的工作:

  • 该类从CObject派生。
  • 在类声明中包括DECLARE_SERIAL宏定义。
  • 提供一个缺省的构造函数。
  • 在类中实现Serialze函数
  • 使用IMPLEMENT_SERIAL指明类名和版本号

下面的代码建立了一个简单身份证记录的类,同时也能够支持序列化。

in H
struct strPID
{
	char szName[10];
	char szID[16];
	struct strPID* pNext;
};
class CAllPID : public CObject
{
public:
	DECLARE_SERIAL(CAllPID)
	CAllPID();
	~CAllPID();
	
public:// 序列化相关	
	struct strPID* pHead;
	//其他的成员函数
	void Serialize(CArchive& ar);
};

in CPP
IMPLEMENT_SERIAL(CAllPID,CObject,1) // version is 1,版本用于读数据时的检测
void CAllPID::Serialize(CArchive& ar)
{
	int iTotal;
	if(ar.IsStoring())
	{//保存数据
		iTotal=GetTotalID();//得到链表中的记录数量
		arr<<iTotal;
for each item in the list
{
for(int i=0;i>26;i++) ar<<&(((BYTE*)pItem)+i);//写一个strPID中所有的数据 } } else {//读数据 ar>>iTotal; for(int i=0;i<iTotal;i++)
{
struct strPID *pID=new struct strPID;
for(int j=0;j>26;j++) ar>>*(((BYTE*)pID)+j);//读一个strPID中所有的数据 //修改链表 } } }
当然上面的代码很不完整,但已经可以说明问题。这样CAllPID就是一个可以支持序列化的类,并且可以根据记录的数量动态分配内存。在序列化中我们使用了CArchive类,该类用于在序列化时提供读写支持,它重载了<<和>>运算符号,并且提供Read和Write函数对数据进行读写。

下面看看如何在文档中使用序列化功能,你只需要修改文档类的Serialize(CArchive& ar)函数,并调用各个进行序列化的类的Serial进行数据读写就可以了。当然你也可以在文档类的内部进行数据读写,下面的代码利用序列化功能读写数据:

class CYourDoc : public CDocument
{
	void Serialize(CArchive& ar);
	CString m_szDesc;
	CAllPID m_allPID;
......
}

void CYourDoc::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{//由于CString对CArchive定义了<<和>>操作符号,所以可以直接利用>>和<<
		ar<<m_szDesc;
}
else
{
ar>>m_szDesc; } m_allPID.Serialize(ar);//调用数据类的序列化函数

 

  《Visual C++开发指南》 闻怡洋/文


  
相关报道




本站检索



中华网推荐

·国家级治脑病新药思维源
·中藏药治疗脑病新突破
·治类风湿,强直性脊柱炎
·养肾·痛风·长寿
·肝病泌尿脑萎缩新药介绍
·强直性脊柱炎康复乐园
·让中医辩证不孕不育
·国医治股骨头坏死一绝
·乙肝为何久治不愈?
·二千元垄断批发做老板
·中医中药专治前列腺
·治牛皮癣白癜风已成现实
·专治痛风病的白衣天使
·不孕不育的杏林奇葩
·专卖店零售管理系统





   

网络教室编辑信箱