MFC实现类的序列化

目录

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

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

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

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

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

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

在程序启动时加载序列化


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

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

#pragma once


class people {
public:
	int age;
	int weight;
	int height;
};

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

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

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

#pragma once
//导入#include<afx.h>头文件,使类能继承CObject
#include<afx.h>


class people :public CObject {

public:
	int age;
	int weight;
	int height;
};

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

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

#pragma once
#include<afx.h>


class people :public CObject {
public:
	DECLARE_SERIAL(people);
	people();
public:
	int age;
	int weight;
	int height;
};

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

#include "pch.h"
#include "people.h"

//第一个参数是类的名字,第二个参数是父类名字,第三个参数是版本号(一般版本号从1开始)
IMPLEMENT_SERIAL(people, CObject, 1);

people::people()
{
}

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

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;
	}
    /*直接使用数组调用该方法,因为数组已经实现了这个方法,数组存放的元素是CPoint,CPoint
      本省也是支持序列化*/
	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*是一个数组的话,例如这样

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

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);
		}
		
	}
}

 

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MFC(Microsoft Foundation Classes)是微软提供的一套用于开发Windows桌面应用程序的C++类库。在MFC中,序列(Serialization)是指将对象的状态转换为可以存储或传输的格式,而反序列(Deserialization)则是将存储或传输的数据恢复为对象的状态。 MFC提供了一些类和宏来支持序列和反序列操作,主要涉及以下几个类: 1. CObject类:所有支持序列MFC类都继承自CObject类。它提供了一些虚拟函数,如Serialize用于实现对象的序列和反序列操作。 2. CArchive类:用于创建和操作存储或传输数据的存档文件。CArchive类提供了Serialize函数,用于将对象的状态写入存档文件或从存档文件中读取对象的状态。 3. CFile类:用于对文件进行读写操作。它提供了Open、Read、Write等函数来操作文件。CArchive类可以使用CFile类来读写数据。 下面是一个简单的示例代码,演示了如何在MFC中进行序列和反序列操作: ```cpp // 假设有一个自定义的类MyData,需要支持序列和反序列 class MyData : public CObject { public: int m_value; // 实现Serialize函数来进行对象的序列和反序列操作 void Serialize(CArchive& ar) { if (ar.IsStoring()) // 写入数据 ar << m_value; else // 读取数据 ar >> m_value; } }; // 序列操作 void SerializeData() { CFile file(_T("data.dat"), CFile::modeCreate | CFile::modeWrite); CArchive ar(&file, CArchive::store); MyData data; data.m_value = 42; data.Serialize(ar); // 将对象的状态写入存档文件 ar.Close(); file.Close(); } // 反序列操作 void DeserializeData() { CFile file(_T("data.dat"), CFile::modeRead); CArchive ar(&file, CArchive::load); MyData data; data.Serialize(ar); // 从存档文件中读取对象的状态 ar.Close(); file.Close(); // 使用反序列后的对象... int value = data.m_value; } ``` 在上述示例中,Serialize函数根据ar对象的状态进行读写操作,将m_value成员变量的值进行序列和反序列。通过创建CFile和CArchive对象,可以实现对存档文件的读写操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值