程序中用到了许多数据类型,特别是结构体和类,自定义的数据类型等。
你的程序处理的这种数据就是文档。
拿普通编辑器来说,肯定有一个cstring的数据用来存放用户编辑的文字,并且这串文字还有许多特性也需要记录,比如颜色,字体等,那没与此相关的就还有许多变量。
序列化的意思就是,如何将这些文档数据存盘,以及如何读取出来显示。那能有两种办法可以做到,一、利用cfile将每个数据依次写入磁盘,读取时又将文件中的数据依次读到变量,这种方式很繁琐,你必须依次做。
二、利用cfile和carchive配合,进行读写文件,并统一写为一个函数,例如:
mystruct m_mydata1;
int m_mydata2:
cstring m_mydata3;
colorref m_mydata4; //等等
上面假设是一种编辑器要处理的数据,是cmydoc的成员。
void cmydoc::serialize(carchive& ar)
{
if( ar.isstoring() ) //如果是存盘
{
ar.write( &m_mydata1, sizeof(mystruct) );
ar<<m_mydata2;
ar<<m_mydata3;
ar<<m_mydata4;
//上面后三行也可以写为ar<<m_mydata2<<m_mydata3<<m_mydata4;
//因为<<操作符又将返回一个carchive对象。
}
else //如果是读取
{
ar.read( &m_mydata1, sizeof(mystruct) );
ar>>m_mydata2;
ar>>m_mydata3;
ar>>m_mydata4;
//上面后三行也可以写为ar>>m_mydata2>>m_mydata3>>m_mydata4;
//因为>>操作符又将返回一个carchive对象。
}
}
当需要存盘时:
void cmydoc::savefiletodisk()
{
cfile file;
file.open( "yourfile.mdt", cfile::modewrite|cfile::modecreate );
carchive ar( &file,carchive::store );
serialize( ar );
ar.close();
file.close();
}
当需要读取文件时:
void cmydoc::readfilefromdisk()
{
cfile file;
file.open( "yourfile.mdt", cfile::moderead );
carchive ar( &file,carchive::load );
serialize( ar );
ar.close();
file.close();
}
这就是我们自己实现的序列化,也就是序列化的原理。
应该注意的是,carchive采用>>和<<来读写文件,其操作的数据如果是类,这个类必须从cobject派生,并声明为declare_serial,如果不从cobject派生,则需要实现>>和<<操作符,比如cstring不从cobject派生,但它实现了>>和<<操作符。对于结构体,你需要调用carchive::read/write来进行,对于简单数据类型可以直接使用>>和<<操作符。
另外,基于文档/视结构的mfc程序,其框架实现了上述序列化的savefiletodisk和readfilefromdisk(隐藏了),只提供了一个serialize()函数,你只需要在其中加入要序列化的变量。
以上是序列化的全过程。
你的程序处理的这种数据就是文档。
拿普通编辑器来说,肯定有一个cstring的数据用来存放用户编辑的文字,并且这串文字还有许多特性也需要记录,比如颜色,字体等,那没与此相关的就还有许多变量。
序列化的意思就是,如何将这些文档数据存盘,以及如何读取出来显示。那能有两种办法可以做到,一、利用cfile将每个数据依次写入磁盘,读取时又将文件中的数据依次读到变量,这种方式很繁琐,你必须依次做。
二、利用cfile和carchive配合,进行读写文件,并统一写为一个函数,例如:
mystruct m_mydata1;
int m_mydata2:
cstring m_mydata3;
colorref m_mydata4; //等等
上面假设是一种编辑器要处理的数据,是cmydoc的成员。
void cmydoc::serialize(carchive& ar)
{
if( ar.isstoring() ) //如果是存盘
{
ar.write( &m_mydata1, sizeof(mystruct) );
ar<<m_mydata2;
ar<<m_mydata3;
ar<<m_mydata4;
//上面后三行也可以写为ar<<m_mydata2<<m_mydata3<<m_mydata4;
//因为<<操作符又将返回一个carchive对象。
}
else //如果是读取
{
ar.read( &m_mydata1, sizeof(mystruct) );
ar>>m_mydata2;
ar>>m_mydata3;
ar>>m_mydata4;
//上面后三行也可以写为ar>>m_mydata2>>m_mydata3>>m_mydata4;
//因为>>操作符又将返回一个carchive对象。
}
}
当需要存盘时:
void cmydoc::savefiletodisk()
{
cfile file;
file.open( "yourfile.mdt", cfile::modewrite|cfile::modecreate );
carchive ar( &file,carchive::store );
serialize( ar );
ar.close();
file.close();
}
当需要读取文件时:
void cmydoc::readfilefromdisk()
{
cfile file;
file.open( "yourfile.mdt", cfile::moderead );
carchive ar( &file,carchive::load );
serialize( ar );
ar.close();
file.close();
}
这就是我们自己实现的序列化,也就是序列化的原理。
应该注意的是,carchive采用>>和<<来读写文件,其操作的数据如果是类,这个类必须从cobject派生,并声明为declare_serial,如果不从cobject派生,则需要实现>>和<<操作符,比如cstring不从cobject派生,但它实现了>>和<<操作符。对于结构体,你需要调用carchive::read/write来进行,对于简单数据类型可以直接使用>>和<<操作符。
另外,基于文档/视结构的mfc程序,其框架实现了上述序列化的savefiletodisk和readfilefromdisk(隐藏了),只提供了一个serialize()函数,你只需要在其中加入要序列化的变量。
以上是序列化的全过程。