使用 CArchive << 和 >> 运算符

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

POINTCPoint

DWORD

BYTE

RECTCRect

Double

LONG

CTimeCTimeSpan

Int

COleCurrency

COleVariant

COleDateTime

COleDateTimeSpan

 

备注

存储和加载的 CObjects 和存档需要通过额外的注意事项。有关详细信息,请参阅 存储和加载的 CObjects 通过存档

CArchive <<>> 运算符总是返回对 CArchive 对象的引用,是第一个操作数。 这样您可以让运算符,如下所示:

archive << m_strName << m_wAge;

请参见

概念

序列化:对象的序列化