MFC技术之手动创建Serialize序列化文件简单应用
第一步:创建Win32工程控制台程序
第二步:设置【高级】--【MFC使用】--【在共享DLL中使用MFC】
第三步:添加MFC库头文件、关键宏定义
#define _AFXDLL //MFC程序的宏定义 #include <afxwin.h> //MFC程序头文件 #include <afx.h> //MFC程序头文件
第四步:继承CObject基类,定义Person对象,重写Serialize()以及operator<<()友元操作符函数
第五步:编写序列化读写测试
第六步:代码
Person.h头文件
#pragma once /** * 定义数据对象 */ #define _AFXDLL //MFC程序的宏定义 #include <afxwin.h> //MFC程序头文件 #include <afx.h> //MFC程序头文件 class Person : public CObject { DECLARE_SERIAL(Person) //第一个宏的位置,参数为当前类名 public: Person(); ~Person(); public: //重写了Serialize成员函数,实现对象序列化读写操作 virtual void Serialize(CArchive& ar); //重写操作符友元函数 friend CArchive& AFXAPI operator<<(CArchive& ar, Person & src); friend CArchive& AFXAPI operator>>(CArchive& ar, Person & src); //定义对象数据 public: long m_id; CString m_name; int m_age; };
Person.cpp源文件
#include "Person.h" //关键宏定义:第二个宏的位置, //第一个参数为当前类名, //第二个参数为父类类名, //第三个参数为该类的特定整型标识,该标识将用来解序(重新实例化),最小为0 IMPLEMENT_SERIAL(Person, CObject, 1) Person::Person():CObject() { m_id = 0; m_age = 0; } Person::~Person() { } void Person::Serialize(CArchive& ar) { //序列化读写基类对象数据 CObject::Serialize(ar); //序列化读写当前对象数据 if (ar.IsStoring())//判断读写操作,写操作,将数据写入到文件,加载为ar.IsLoading() { ar << m_id << m_name << m_age; //功能类似cout、cin的IO数据流操作 } else //读操作,将文件读入到内存 { ar >> m_id >> m_name >> m_age; } } CArchive& AFXAPI operator>>(CArchive& ar, Person& src) { return ar >> src.m_id >> src.m_name >> src.m_age; } CArchive& AFXAPI operator<<(CArchive& ar, Person& src) { return ar << src.m_id << src.m_name << src.m_age; }
main()函数
// TSTMFC序列化读写.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include <iostream> #include "Person.h" using namespace std; #define WRITE //读写控制宏 读:READ 写:WRITE //测试入口函数 int main() { #ifdef WRITE cout << "执行写文件操作\n" << endl; CFile file(_T("person.txt"), CFile::modeCreate | CFile::modeWrite); //定义一个文件流对象 CArchive ar(&file, CArchive::store); //定义一个序列化对象和文件流对象绑定并指定归档方式为储存,加载的方式为CArchive::load Person person; person.m_id = 12345; person.m_name = "zhangsan"; person.m_age = 12; person.Serialize(ar); ar.Close(); file.Close(); #endif #ifdef READ cout << "执行读文件操作\n" << endl; CFile file(_T("person.txt"), CFile::modeRead); //定义一个文件流对象 CArchive ar(&file, CArchive::load); //定义一个序列化对象和文件流对象绑定并指定归档方式为储存,加载的方式为CArchive::load Person person; person.Serialize(ar); cout << person.m_id << "|" << person.m_name << "|" << person.m_age << endl; ar.Close(); file.Close(); cin.get(); #endif // DEBUG } // 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单 // 调试程序: F5 或调试 >“开始调试”菜单 // 入门使用技巧: // 1. 使用解决方案资源管理器窗口添加/管理文件 // 2. 使用团队资源管理器窗口连接到源代码管理 // 3. 使用输出窗口查看生成输出和其他消息 // 4. 使用错误列表窗口查看错误 // 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目 // 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件