; if (ar.IsStoring())
{
// TODO: add storing code here
}
else
{
// TODO: add loading code here
}
}
由于Cstring类(m_message是其的一个对象)定义了>>和<<运算符用于向文档传递字符串,因此保存和加载文档类的数据就是一件简单的事情。在提醒增加保存代码的注释的地方增加以下行:
ar<<m_message;
同样,在加载代码的地方增加增加以下行:
ar>>m_message;
《运算符将CSTring m_message传送给文档》运算符把文档赋给m_message。只要所有的文档成员变量都是如整数或字符那样的简单数据类型,利用象CString这样已经定义了此运算符的MFC类,保存和加载数据将非常简单,此运算符是为下列这些简单数据类型定义的:
* BYTE
* WORD
* int
* LONG
* DWORD
* float
* double
创建这个应用程序File Demo,并运行它。选择Edit|Message命令,就可以看到屏幕上出现了新的串,选择File|Save并输入一个易记的文件名。再次修改消息,选择File|New,用户会得到应先保存当前修改过的数据的警告。选择File|Open浏览文件,或者在File菜单的底部找到刚刚存储的文件的文件名,单击它也可以打开这个文件。可以看到File Demo的确可以保存和重新载入一个串。
File Demo用命令修改了串值
用户不会无意丢失未保存的数据了
创建一个持久类
但是如果读者已经创建了自己的定制类用于保存文档的元素该怎么办呢?如何使得此类的一个对象成为持久呢?
假设读者现在想改进File Demo应用程序使其能够在一个称为CMessages的定制类中包含程序的数据。此时该成员变量称为m_messages,它是CMessages的一个实例。此类包含三个CString对象,如果要使应用程序正常运行,必须对上述三个对象进行保存和加载。保存和加载它们的一种方法是分别保存和加载每一个字符串,代码如程序清单5所示:
程序清单5 保存新类的字符串的一种方注
void CFileDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
ar << m_messages.m_message1;
ar << m_messages.m_message2;
ar << m_messages.m_message3;
}
else
{
ar >> m_messages.m_message1;
ar >> m_messages.m_message2;
ar >> m_messages.m_message3;
}
}
如果在CMessages类中定义这三个成员变量为public,而且知道类是如何实现的,读者就可以编写如清单5中所示的代码。之后,如果类以任何其他方式发生变化,此代码也必须改变。把存贮和加载工作交付给CMessages类自身去完成更具有面向对象的意义。这需要一些准备,创建一个能串行化的其成员变量的类的基本步骤如下:
1) 由CObject派生此类。
2) 在类定义部分放置DECLAR_SERIAL( )宏。
3) 在类实现部分放置IMPLEMENT_SERIAL( )宏。
4) 重载类中的Serialize( )函数。
5) 提供一个类的空的缺省构造函数。
☆ File Demo 2 应用程序
下一个示例应用程序File Demo 2,演示创建一个可由此创建持久对象的类的步骤。它包含了可以修改三个串的Edit|Change Messages命令。与Fil