创建 CArchive 对象的两种方法

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

通过框架隐式创建 CArchive 对象

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

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

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

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

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

  4. 调用派生自Serialize的类中定义的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 对象加载数据后,请将其关闭。 尽管CArchiveCFile 对象会自动关闭存档和文件,但最好能显式地这样做,因为这样可以更容易地从错误中恢复。 有关错误处理的详细信息,请参阅 “异常:捕获和删除异常”一文。

若要关闭 CArchive 对象

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

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

另请参阅

序列化:序列化对象