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 文件

 

posted @ 2022-09-09 14:53  百年一梦  阅读(225)  评论(0编辑  收藏  举报