数据串行化
利用CArchive类实现数据串行化,
需要注意的是,
串行化的对象一定要是从CObject类派生出来的,
同时,
要在被串行化的对象的类的头文件中进行宏定义
//文件串行化宏定义
DECLARE_SERIAL(CMyBox)
还要在被串行化的对象的类的实现文件中进行宏定义
//对象串行化宏定义
IMPLEMENT_SERIAL(CMyBox,CObject,0);
然后对虚函数void 类名::Serialize(CArchive& ar)进行重载,
添加相应的串行化代码和读取串行化文件代码,
再在需要执行串行化的位置添加代码
CFile file;
file.Open(_T(“1.dat”), CFile::modeWrite| CFile::modeCreate );
CArchive ar(&file, CArchive::store ); //CArchive::load);
CString mycstr(_T(“AAA”));
ar<<mycstr;
ar.Flush();
ar.Close();
file.Close();
即可实现对象的串行化。
同时,可以通过调用函数CObject::IsSerializable 来判断该类是否可被串行化。
在读取被串行化的文件时,
可用如下方法:
CFile myFile(TempName+_T(“.dat”), CFile::modeRead);
// Create a loading archive.
myFile.SeekToBegin();
CArchive arLoad(&myFile, CArchive::load);
// Verify the object is in the archive.
pBox = (CMyBox*) arLoad.ReadObject(RUNTIME_CLASS(CMyBox));
特别要注意的是,
如果被串行化的对象中存在向量,
要使用如下方法:
void Initialization::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{ // storing code
ar<<num;
for(int i=0; i<num; i++)
ar<<item[i];
for(int i=0; i<num; i++)
ar<<level[i];
}
else
{ // loading code
ar>>num;
CString str;
int m_int;
for(int j=0; j<num; j++)
{
ar>>str;
item.push_back(str);
}
for(int k=0; k<num; k++)
{
ar>>m_int;
level.push_back(m_int);
}
}
}
其中num为向量中元素的个数,
应该与向量同时存放在文件中,
并优先读取num。