文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

基于MFC如何实现类的序列化

2023-07-02 16:52

关注

这篇文章主要介绍“基于MFC如何实现类的序列化”,在日常操作中,相信很多人在基于MFC如何实现类的序列化问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”基于MFC如何实现类的序列化”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

序列化是将程序中的对象以一种二进制格式存储到存储设备中(例如文本/数据库等),以实现“永生”或随意“流动”

首先定义一个要序列化的类people,其属性有age、weight、height。

#pragma once  class people {public:    int age;    int weight;    int height;};

定义好后将该类添加到  项目名view.h  的类中,作为其属性,并且是指针类型

基于MFC如何实现类的序列化

将需要存取的类实现序列化 

序列化的类必须从CObject派生,或是从CObject的派生类派生

#pragma once//导入#include<afx.h>头文件,使类能继承CObject#include<afx.h>  class people :public CObject { public:    int age;    int weight;    int height;};

为该类定义一个不带参数的构造函数

基于MFC如何实现类的序列化

在类声明中使用DECLARE_SERIAL(类名)宏

#pragma once#include<afx.h>  class people :public CObject {public:    DECLARE_SERIAL(people);    people();public:    int age;    int weight;    int height;};

在类的实现中添加IMPLEMENT_SERIAL(类名,父类名,版本号)宏 

#include "pch.h"#include "people.h" //第一个参数是类的名字,第二个参数是父类名字,第三个参数是版本号(一般版本号从1开始)IMPLEMENT_SERIAL(people, CObject, 1); people::people(){}

在类的实现中,通过类向导添加Serialize虚函数(也可也手写)

基于MFC如何实现类的序列化

MFC提供了CArchive类可以将对象数据保存到永久设备,比如磁盘文件。当应用程序重新启动后,CArchive类可以帮助我们从磁盘文件读取这些数据,然后在内存中重新构建对应的对象;这样就使得我们的对象数据永久存在,该过程称之为序列化(或者串行化)。 

void people::Serialize(CArchive& ar){    if (ar.IsStoring())    {    // storing code    }    else    {    // loading code    }}

CArchive类重载了输入输出运算符,在存取时就是利用运算符重载

void people::Serialize(CArchive& ar){    if (ar.IsStoring())    {    // storing code        //存数据        ar << age << weight << height;    }    else    {    // loading code        //读数据        ar >> age >> weight >> height;    }}

如果说类的属性中有自定义类型的数组,比如下面这种,其中CPoint是MFC类型对象

#pragma once#include<afx.h>  class people :public CObject {public:    CArray<CPoint>m_point;};

那么在 Serialize设置存取时可以安这样

void people::Serialize(CArchive& ar){    if (ar.IsStoring())    {    // storing code        //存数据        ar << age << weight << height;    }    else    {    // loading code        //读数据        ar >> age >> weight >> height;    }        m_point.Serialize(ar);}

在程序启动时加载序列化

在Doc.cpp文件中找到序列化接口函数

void Cdraw3Doc::Serialize(CArchive& ar){    if (ar.IsStoring())    {        // TODO: 在此添加存储代码    }    else    {        // TODO: 在此添加加载代码    }}

从view类里拿到要序列化的数据people*

void Cdraw3Doc::Serialize(CArchive& ar){    //取出第一个view在链表中的位置    POSITION pos = GetFirstViewPosition();    //通过位置获得该view     Cdraw3View* pView = (Cdraw3View* )GetNextView(pos);    if (ar.IsStoring())    {        //存数据        ar << pView->human;    }    else    {        //取数据        ar >> pView->human;    }}

这样我们每次保存时数据就可以以二进制序列化保存,每次打开时又可以打开上次保存的内容  

如果people*是一个数组的话,例如这样

基于MFC如何实现类的序列化

那么我们在用序列化存取时就要先存取数组长度,再循环存取数组的内容 

void Cdraw3Doc::Serialize(CArchive& ar){    //取出第一个view在链表中的位置    POSITION pos = GetFirstViewPosition();    //通过位置获得该view     Cdraw3View* pView = (Cdraw3View* )GetNextView(pos);    //获得数组长度    int cnt = pView->human.GetSize();    if (ar.IsStoring())    {        //存数据        ar << cnt;        for (int i = 0; i < cnt; i++) {            //循环存储数组            ar << pView->human.GetAt(i);        }    }    else    {        //取长度        ar >> cnt;        for (int i = 0; i < cnt; ++i) {            //依次取数据,加入到数组中            people* p;            ar >> p;            pView->human.Add(p);        }            }}

到此,关于“基于MFC如何实现类的序列化”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯