编写串行化类
下面使用CArchive类实现类的串行化。要设计一个具有串行化的类,通常需要进行5个步骤。首先用户定义的类必须派生于CObject或CObject的子类。然后重载Serialize方法,用以保存对象的数据成员到CArchive对象以及从CArchive对象载入对象的数据成员的状态。接着在类体中加入DECLARE_SERIAL宏,这是串行化类所必须的,然后为类提供一个无参数的构造函数,也就是默认构造函数。最后在类的源文件中加入IMPLEMENT_SERIAL宏。下面通过一个示例来介绍如何编写串行化类。
例如,编写串行化类
(1)创建一个基于对话框的工程,工程名称为“Serialize”。
(2)创建一个CSerialClass类,该类派生于CObject。头文件代码如下。
class CSerialClass : public CObject //定义CSerialClass类
{
public:
CSerialClass(); //默认构造函数
DECLARE_SERIAL(CSerialClass) //添加序列化宏
public:
int m_Data; //定义整型的数据成员
CString m_Text; //定义字符串类型数据成员
public:
public:
virtual void Serialize(CArchive& ar); //改写虚方法
public:
virtual ~CSerialClass(); //析构函数
};
(3)编写CSerialClass类源文件代码。
CSerialClass::CSerialClass() //定义默认构造函数
{
}
CSerialClass::~CSerialClass() //定义析构函数
{
}
IMPLEMENT_SERIAL( CSerialClass, CObject, 1 ) //添加序列化宏
void CSerialClass::Serialize(CArchive& ar) //改写Serialize方法,实现序列化
{
if (ar.IsStoring()) //判断为否为存储数据
{
ar<<m_Data<<m_Text; //向存档对象中写入数据
}
else //加载数据
{
ar>>m_Data>>m_Text; //从存档对象中读取数据
}
}
(4)处理对话框中“保存对象”按钮的单击事件,保存对象的数据成员。
void CSerializeDlg::OnOK()
{
CSerialClass serial; //定义CSerialClass类对象
CFile file("SerialClass.dat",CFile::modeCreate|CFile::modeWrite); //定义文件对象
CArchive ar(&file,CArchive::store); //定义存档对象
serial.m_Data = 2008; //设置对象数据成员
serial.m_Text = "同一个世界,同一个梦想"; //设置对象的数据成员
serial.Serialize(ar); //串行化对象,存储数据
}
(5)处理“加载对象”按钮的单击事件,加载文件中的数据到对象的数据成员中。
void CSerializeDlg::OnLoad()
{
CSerialClass serial; //定义CSerialClass类对象
CFile file("SerialClass.dat",CFile::modeRead); //定义文件对象
CArchive ar(&file,CArchive::load); //定义存档对象
serial.Serialize(ar); //串行化对象,加载数据
MessageBox(serial.m_Text,"提示");
}
(6)运行程序,效果如图1所示。
.jpg)
图1 串行化