ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

MFC技术之手动创建Serialize序列化文件简单应用

2022-09-09 15:01:28  阅读:383  来源: 互联网

标签:序列化 MFC Serialize CArchive Person ar include


第一步:创建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 文件

 

标签:序列化,MFC,Serialize,CArchive,Person,ar,include
来源: https://www.cnblogs.com/chenshuangjian/p/16672841.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有