荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: Second (石开), 信区: Program
标 题: 3.5 利用序列化进行文件读写
发信站: 荔园晨风BBS站 (Wed May 30 01:22:09 2001), 转信
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<26;i++)
ar<<&(((BYTE*)pItem)+i);//写一个strPID中所有的数据
}
}
else
{//读数据
ar>>iTotal;
for(int i=0;i26;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;
}
m_allPID.Serialize(ar);//调用数据类的序列化函数
}
--
既然热爱生命
那么,
一切都在意料之中。
※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.28.190]
[回到开始]
[上一篇][下一篇]
荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店