创建 CArchive 对象的两种方法

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

通过框架隐式创建 CArchive 对象

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

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

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

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

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

  4. Serialize调用在 -derived 类中CDocument定义的函数,向其传递对对象的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();
    

另请参阅

序列化:序列化对象