MFC - 序列化

序列化是向持久存储介质(例如磁盘文件)写入或读取对象的过程。 序列化非常适合需要在程序执行期间或之后维护结构化数据(例如 C++ 类或结构)的状态的情况。

执行文件处理时,值通常是基本类型(char、short、int、float 或 double)。 以同样的方式,我们可以单独保存多个值,一次一个。 此技术不包括从类创建的对象(作为类的变量)。

MFC 库对序列化具有高级别的支持。 它从 CObject 类开始,该类是大多数 MFC 类的祖先,该类配备了 Serialize() 成员函数。

让我们通过创建一个新的 MFC 项目来研究一个简单的示例。

步骤 1 − 删除 TODO 行并设计对话框,如下面的快照所示。

删除 TODO 行

步骤 2 − 为所有编辑控件添加值变量。 对于提到的 Emp ID 和 Age,值类型是整数,如下快照所示。

序列化添加变量

步骤 3 − 为两个按钮添加事件处理程序。

步骤 4 − 现在让我们添加一个简单的 Employee 类,我们需要对其进行序列化。 这是头文件中 Employee 类的声明。

class CEmployee : public CObject {
   public:
      int empID;
      CString empName;
      int age;
      CEmployee(void);
      ~CEmployee(void);
   private:

   public:
      void Serialize(CArchive& ar);
      DECLARE_SERIAL(CEmployee);
};

步骤 5 − 以下是源 (*.cpp) 文件中 Employee 类的定义。

IMPLEMENT_SERIAL(CEmployee, CObject, 0)
CEmployee::CEmployee(void) {

}

CEmployee::~CEmployee(void) {

}

void CEmployee::Serialize(CArchive& ar) {
   CObject::Serialize(ar);

   if (ar.IsStoring())
      ar << empID << empName << age;
   else
      ar >> empID >> empName >> age;
}

步骤 6 − 这是保存按钮事件处理程序的实现。

void CMFCSerializationDlg::OnBnClickedButtonSave() {
   // TODO:在此处添加您的控件通知处理程序代码
   UpdateData(TRUE);
   CEmployee employee;
   CFile file;
   file.Open(L"EmployeeInfo.hse", CFile::modeCreate | CFile::modeWrite);
   CArchive ar(&file, CArchive::store);
   employee.empID = m_id;
   employee.empName = m_strName;
   employee.age = m_age;
   employee.Serialize(ar);
   ar.Close();
}

步骤 7 − 这是打开按钮事件处理程序的实现。

void CMFCSerializationDlg::OnBnClickedButtonOpen() {
   // TODO:在此处添加您的控件通知处理程序代码
   UpdateData(TRUE);

   CFile file;

   file.Open(L"EmployeeInfo.hse", CFile::modeRead);
   CArchive ar(&file, CArchive::load);
   CEmployee employee;

   employee.Serialize(ar);

   m_id = employee.empID;
   m_strName = employee.empName;
   m_age = employee.age;
   ar.Close();
   file.Close();

   UpdateData(FALSE);
}

步骤 8 − 当上面的代码被编译并执行时,您将看到以下输出。

序列化结果

步骤 9 − 在所有字段中输入信息,然后单击保存并关闭该程序。

序列化插入信息

步骤 10 − 它将保存数据。 再次运行该应用程序并单击"打开"。 它将加载员工信息。

序列化保存信息