序列化就是存储对象数据,反序列化就是读取保存的对象数据
mfc的串行序列化的实现几个必要条件
1.类对象必须要直接或间接继承cobject对象
2.类中要有默认的构造函数
3.类中要有DECLARE_SERIAL( 类名)的声明,类实现的外部要有IMPLEMENT_SERIAL( 类名, 直接继承的类, 1)
4.类要继承cobject的虚函数实现virtual void Serialize( CArchive &ar);
5.序列化实现时,类对象保存必须要是指针形式
举例如下:
class CPerson :public CObject
{
DECLARE_SERIAL( CPerson )
public:
CPerson();
CPerson( int n, CString &Str );
~CPerson()
{
}
virtual void Serialize( CArchive &ar);
int nvalue;
CString str;
};
IMPLEMENT_SERIAL( CPerson, CObject, 1)
CPerson::CPerson()
{
}
CPerson::CPerson( int n, CString &strr)
{
nvalue = n;
str = strr;
}
void CPerson::Serialize(CArchive &ar )
{
if(ar.IsStoring())
{
ar<<nvalue<<str;
}
else{
ar>>nvalue>>str;
}
}
主程序保存:
CFile cf;
cf.Open( "c:\\a.txt", CFile::modeCreate|CFile::modeWrite );
CString str("123456");
CPerson cpp(2, str );
CPerson *cp=&cpp;
CArchive car( &cf, CArchive::store );
int a=3;
CString ss("789多发点");
cb *ccb = new cb( 3, ss);
car<<cp<<a;
cf.Close();
主程序读取:
CFile cf;
cf.Open( "c:\\a.txt", CFile::modeRead );
CPerson *cp = NULL;
CArchive car( &cf, CArchive::load );
int a= 0;
cb *ccb= NULL;
car>>cp>>a;//此处读取时必须先是cpp然后是a,必须与保存的顺序对应,否则会出错的
int i = 0;
i= cp->nvalue;
CString str;
str = cp->str;
cf.Close();