CArchive 提供 << 和 >> 运算符写入和读取简单数据类型以及 CObjects 到和从文件。
通过存档将对象存储在文件中
下面的示例演示如何通过存档将对象存储到文件中:
CArchive ar(&theFile, CArchive::store); WORD wEmployeeID = 78; ar << wEmployeeID;
从先前存储在文件中的值加载对象
下面的示例演示如何从以前存储在文件中的值加载对象:
CArchive ar(&theFile, CArchive::load); WORD wEmployeeID; ar >> wEmployeeID;
通常,在 CObject 派生类的 Serialize 函数通过存档存储数据到一个文件和从一个文件加载数据,则必须用DECLARE_SERIALIZE 宏声明。 对 CArchive 对象的引用传递给 Serialize 函数。 调用 CArchive 对象的 IsLoading 函数确定 Serialize 函数是否从文件或存储数据加载到数据文件。
序列化 CObject 派生类的 Serialize 的函数通常具有以下形式:
void CSerializableObj::Serialize( CArchive& archive )
{
// call base class function first
// base class is CObject in this case
CObject::Serialize( archive );
// now do the stuff for our specific class
if( archive.IsStoring() )
{
// TODO: add storing code here
}
else
{
// TODO: add storing code here
}
}
以上代码是一 AppWizard 模板正常提供文档的 Serialize 函数创建相同的类 (从 **CDocument)**派生的类。 此代码模板帮助您编写代码更易于检查,因为存储的代码和加载的代码总是并行,如下面的示例中:
void CEmployee::Serialize( CArchive& archive )
{
// call base class function first
// base class is CObject in this case
CObject::Serialize( archive );
// now do the stuff for our specific class
if( archive.IsStoring() )
archive << m_strName << m_wAge;
else
archive >> m_strName >> m_wAge;
}
库为 CArchive 定义了 << 和 >> 运算符作为第一个操作数和以下数据类型和类类型用作第二个操作对象:
CObject* |
SIZE 和 CSize |
float |
WORD |
CString |
POINT 和 CPoint |
DWORD |
BYTE |
RECT 和 CRect |
Double |
LONG |
CTime 和 CTimeSpan |
Int |
COleCurrency |
COleVariant |
COleDateTime |
COleDateTimeSpan |
|
备注
存储和加载的 CObjects 和存档需要通过额外的注意事项。有关详细信息,请参阅 存储和加载的 CObjects 通过存档。
CArchive << 和 >> 运算符总是返回对 CArchive 对象的引用,是第一个操作数。 这样您可以让运算符,如下所示:
archive << m_strName << m_wAge;