创建 CArchive 对象的两种方法
可通过两种方法创建 CArchive
对象:
通过框架隐式创建 CArchive 对象
最常见也是最简单的方法是让框架代表“文件”菜单上的“保存”、“另存为”和“打开”命令为文档创建 CArchive
对象。
当应用程序的用户从“文件”菜单发出“另存为”命令时,框架将执行以下操作:
显示“另存为”对话框并从用户处获取文件名。
将用户命名的文件作为
CFile
对象打开。创建指向此
CFile
对象的CArchive
对象。 在创建CArchive
对象时,框架将模式设置为“存储”(写入、序列化),而不是“加载”(读取、反序列化)。调用在
CDocument
派生类中定义的Serialize
函数,向其传递对CArchive
对象的引用。
然后,文档的 Serialize
函数将数据写入 CArchive
对象,并稍后对此进行解释。 从 Serialize
函数返回后,框架将销毁 CArchive
对象,然后销毁 CFile
对象。
因此,如果让框架为文档创建 CArchive
对象,则只需实现文档的 Serialize
函数,该函数向/从存档写入/读取数据。 还必须为文档的 Serialize
函数反过来直接或间接序列化的任何 CObject
派生对象实现 Serialize
。
显式创建 CArchive 对象
除了通过框架序列化文档之外,还存在可能需要 CArchive
对象的其他情况。 例如,你可能希望将数据序列化到剪贴板/从剪贴板序列化数据,该剪贴板由 CSharedFile
对象表示。 或者,你可能想要使用用户界面来保存与框架提供的文件不同的文件。 在此情况下,可以显式创建 CArchive
对象。 使用以下过程,采用框架所采用的相同方式执行此操作。
若要显式创建 CArchive 对象
构造
CFile
对象或从CFile
派生的对象。将
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 对象
以下示例介绍如何关闭
CArchive
对象:archive.Close(); theFile.Close();