关于CArchive 类
创建 CArchive 对象有两种方法:
- 通过框架隐式创建 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 对象。使用下列过程,用与框架采用的相同方式来执行此操作。
- 构造 CFile 对象或从 CFile 导出的对象。
- 按照下面示例所示,将 CFile 对象传递到 CArchive 的构造函数:
CFile theFile; theFile.Open(..., CFile::modeWrite); CArchive archive(&theFile, CArchive::store);
CArchive 构造函数的第二个参数是指定存档将用于向文件中存储数据还是用于从文件中加载数据的枚举值。对象的
Serialize
函数通过调用存档对象的 IsStoring 函数来检查该状态。
当完成向 CArchive 对象存储数据或从该对象中加载数据时,关闭该对象。虽然 CArchive 对象(和 CFile 对象)会自动关闭存档(和文件),好的做法是显式执行,因为这使从错误恢复更为容易。
关闭 CArchive 对象
- 以下示例阐释了如何关闭 CArchive 对象:
archive.Close(); theFile.Close();