创建 CArchive 对象的两种方法

可通过两种方法创建 CArchive 对象:

通过框架隐式创建 CArchive 对象

最常见也是最简单的方法是让框架代表“文件”菜单上的“保存”、“另存为”和“打开”命令为文档创建 CArchive 对象。

当应用程序的用户从“文件”菜单发出“另存为”命令时,框架将执行以下操作:

  1. 显示“另存为”对话框并从用户处获取文件名

  2. 将用户命名的文件作为 CFile 对象打开。

  3. 创建指向此 CFile 对象的 CArchive 对象。 在创建 CArchive 对象时,框架将模式设置为“存储”(写入、序列化),而不是“加载”(读取、反序列化)。

  4. 调用在 CDocument 派生类中定义的 Serialize 函数,向其传递对 CArchive 对象的引用。

然后,文档的 Serialize 函数将数据写入 CArchive 对象,并稍后对此进行解释。 从 Serialize 函数返回后,框架将销毁 CArchive 对象,然后销毁 CFile 对象。

因此,如果让框架为文档创建 CArchive 对象,则只需实现文档的 Serialize 函数,该函数向/从存档写入/读取数据。 还必须为文档的 Serialize 函数反过来直接或间接序列化的任何 CObject 派生对象实现 Serialize

显式创建 CArchive 对象

除了通过框架序列化文档之外,还存在可能需要 CArchive 对象的其他情况。 例如,你可能希望将数据序列化到剪贴板/从剪贴板序列化数据,该剪贴板由 CSharedFile 对象表示。 或者,你可能想要使用用户界面来保存与框架提供的文件不同的文件。 在此情况下,可以显式创建 CArchive 对象。 使用以下过程,采用框架所采用的相同方式执行此操作。

若要显式创建 CArchive 对象

  1. 构造 CFile 对象或从 CFile 派生的对象。

  2. CFile 对象传递给 CArchive 的构造函数,如以下示例所示:

    CFile theFile;
    theFile.Open(_T("CArchive__Test.txt"), CFile::modeCreate | CFile::modeWrite);
    CArchive archive(&theFile, CArchive::store);
    

    CArchive 构造函数的第二个参数是一个枚举值,该值指定存档是用于将数据存储到文件中还是从文件中加载数据。 对象的 Serialize 函数通过调用存档对象的 IsStoring 函数来检查此状态。

完成将数据存储到 CArchive 对象或从该对象加载数据后,请将其关闭。 虽然 CArchive(和 CFile)对象将自动关闭存档(和文件),但显式执行此操作是一种良好的做法,因为这样做可以更轻松地从错误中恢复。 有关错误处理的详细信息,请参阅文章异常:捕获和删除异常

若要关闭 CArchive 对象

  1. 以下示例介绍如何关闭 CArchive 对象:

    archive.Close();
    theFile.Close();
    

另请参阅

序列化:对象的序列化