iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >基于MFC如何实现类的序列化
  • 566
分享到

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

2023-07-02 16:07:37 566人浏览 安东尼
摘要

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

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

--结束END--

本文标题: 基于MFC如何实现类的序列化

本文链接: https://www.lsjlt.com/news/343081.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 基于MFC如何实现类的序列化
    这篇文章主要介绍“基于MFC如何实现类的序列化”,在日常操作中,相信很多人在基于MFC如何实现类的序列化问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”基于MFC如何实现类的序列化”的疑惑有所帮助!接下来,请跟...
    99+
    2023-07-02
  • 基于MFC实现类的序列化详解
    序列化是将程序中的对象以一种二进制格式存储到存储设备中(例如文本/数据库等),以实现“永生”或随意“流动” 首先定义一个要序列化的类p...
    99+
    2024-04-02
  • MFC怎么实现类的序列化
    在MFC中,可以通过以下步骤来实现类的序列化:1. 在类的声明中添加`DECLARE_SERIAL`宏,用于声明该类可以被序列化。`...
    99+
    2023-08-14
    MFC
  • JavaScript如何实现基于JSON的序列化和反序列化
    这篇文章将为大家详细讲解有关JavaScript如何实现基于JSON的序列化和反序列化,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。基于JSON的序列化和反序列化(ser...
    99+
    2024-04-02
  • Java对象流如何实现序列化的类
    小编给大家分享一下Java对象流如何实现序列化的类,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Java有哪些集合类Java中的集合主要分为四类:1、List列表...
    99+
    2023-06-14
  • C#如何实现序列化和反序列化
    这篇文章给大家分享的是有关C#如何实现序列化和反序列化的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。.net下有一种技术叫做对象序列化,说得通俗一点,C#序列化就是把一个对象保存到一个文件或数据库字段中去,C#反...
    99+
    2023-06-17
  • 基于MFC如何实现单个文档的文件读写
    这篇“基于MFC如何实现单个文档的文件读写”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“基于MFC如何实现单个文档的文件读写...
    99+
    2023-07-02
  • Java中如何实现序列化和反序列化
    本篇文章给大家分享的是有关Java中如何实现序列化和反序列化,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。序列化序列化:将对象转换为二进制序列在网络中传输或保存到磁盘反序列化:...
    99+
    2023-06-15
  • redis如何实现序列化
    redis实现序列化的示例:Redis提供了两个模板类RedisTemplate和StringRedisTemplate实现序列化,如:RedisAutoConfiguration源码,对key和value进行序列化:public clas...
    99+
    2024-04-02
  • VS2019如何实现C++的MFC程序
    这篇文章主要介绍了VS2019如何实现C++的MFC程序,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、创建项目然后点下一步,配置项目,这里我命名的是myfisrtmfc点...
    99+
    2023-06-15
  • 如何在Java中实现序列化与反序列化
    本篇文章给大家分享的是有关如何在Java中实现序列化与反序列化,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java可以用来干什么Java主要应用于:1. web开发;2. A...
    99+
    2023-06-14
  • C#如何实现XML序列化
    这篇文章给大家分享的是有关C#如何实现XML序列化的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。实现C# XML序列化技术使用到什么具体的方法呢?我们在具体的操作过程中需要注意什么呢?那么这里向你展示一个Demo...
    99+
    2023-06-17
  • Storm中的数据序列化和反序列化是如何实现的
    在Storm中的数据序列化和反序列化是通过实现backtype.storm.serialization.Serializer接口来实...
    99+
    2024-03-13
    Storm
  • 基于Redis如何实现阻塞队列
    这篇文章主要介绍“基于Redis如何实现阻塞队列”,在日常操作中,相信很多人在基于Redis如何实现阻塞队列问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”基于Redis如何实现阻塞队列”的疑惑有所帮助!接下来...
    99+
    2023-06-22
  • 如何实现ProtoBuf序列化的尝试
    今天给大家介绍一下如何实现ProtoBuf序列化的尝试。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。ProtoBuf 是谷歌开源的序列化组件.二进制,速度快....
    99+
    2023-06-03
  • 序列化与反序列化如何在java项目中实现
    序列化与反序列化如何在java项目中实现 ?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。 1.Java序列化与反序列化 Java序列化是指把...
    99+
    2023-05-31
    java 序列化 反序列化
  • 如何实现基于css3的列表toggle特效
    这篇文章主要讲解了“如何实现基于css3的列表toggle特效”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何实现基于css3的列表toggle特效”吧!...
    99+
    2024-04-02
  • 基于MFC实现单个文档的文件读写
    目录写文件1.添加相应菜单以及ID2.完善相应的事件响应函数3.进行调试测试4.根据测试结果进行相应的修改读文件1.为读文件添加事件响应函数2.完善事件响应函数的代码3.调试测试&n...
    99+
    2024-04-02
  • 基于Pytorch如何实现的声音分类
    今天小编给大家分享一下基于Pytorch如何实现的声音分类的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。环境准备主要介绍li...
    99+
    2023-07-02
  • Java的序列化与反序列化怎么实现
    本篇内容介绍了“Java的序列化与反序列化怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java对象的序列化Java平台允许我们在内...
    99+
    2023-07-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作