序列化是将程序中的对象以二进制格式存储到存储设备(如文本/数据库等)中。)随意实现“永生”或“流动”。本文将详细告诉你如何基于MFC实现类序列化,有需要的可以参考一下。
序列化是将程序中的对象以二进制格式存储在存储设备(如文本/数据库等)中。)随意实现“永生”或“流动”。
首先,定义一个要序列化的类people,其属性为年龄、体重和身高。
#杂注一次
阶级人民{
公共:
int age
int重量;
int高度;
};
定义后,将这个类添加到项目名称view.h的类中作为它的属性,它是一个指针类型。
序列化要访问的类。
1.序列化类必须派生自CObject或CObject的派生类。
#杂注一次
//导入#includeafx.h头文件,以便该类可以继承CObject。
#includeafx.h
类人员:公共对象{
公共:
int age
int重量;
int高度;
};
2.为此类定义一个不带参数的构造函数
3.在类声明中使用DECLARE_SERIAL(类名)宏
#杂注一次
#includeafx.h
类人员:公共对象{
公共:
DECLARE_SERIAL(人);
人();
公共:
int age
int重量;
int高度;
};
4.在类的实现中添加IMPLEMENT_SERIAL(类名、父类名、版本号)宏
#包含“pch.h”
#包含“people.h”
//第一个参数是类名,第二个参数是父类名,第三个参数是版本号(一般版本号从1开始)
IMPLEMENT_SERIAL(people,CObject,1);
人民:人民()
{
}
5.在类的实现中,通过类向导(或手写)添加序列化虚函数
MFC提供了CArchive类来将对象数据保存到永久设备,如磁盘文件。当应用程序重启时,CArchive类可以帮助我们从磁盘文件中读取这些数据,然后在内存中重建相应的对象;这就使得我们的对象数据永远存在,这个过程叫做序列化(或者序列化)。
void people:Serialize(存档ar)
{
如果(ar。IsStoring())
{ //存储代码
}
其他
{ //加载代码
}
}
类CArchive重载输入和输出运算符,这是为了在访问时使用运算符重载。
void people:Serialize(存档ar)
{
如果(ar。IsStoring())
{ //存储代码
//存储数据
年龄体重身高;
}
其他
{ //加载代码
//读取数据
年龄体重身高;
}
}
如果类的属性中有一个自定义类型数组,例如下面的,其中CPoint是一个MFC类型对象。
#杂注一次
#includeafx.h
类人员:公共对象{
公共:
CArrayCPointm _ point
};
这可以在序列化集合访问时完成。
void people:Serialize(存档ar)
{
如果(ar。IsStoring())
{ //存储代码
//存储数据
年龄体重身高;
}
其他
{ //加载代码
//读取数据
年龄体重身高;
}
/*使用数组直接调用此方法,因为数组已经实现了此方法。存储在数组中的元素是CPoint,CPoint。
该省还支持序列化*/
m点。序列化(ar);
}
程序启动时加载序列化。
在Doc.cpp文件中找到序列化接口函数
void cdraw 3 doc:Serialize(car chive ar)
{
如果(ar。IsStoring())
{
//TODO:在此添加存储代码
}
其他
{
//TODO:在此添加加载代码
}
}
从视图类people*中获取要序列化的数据
void cdraw 3 doc:Serialize(car chive ar)
{
//取出链表中第一个视图的位置
POSITION pos=GetFirstViewPosition();
//通过位置获取此视图
cdraw 3 view * pView=(cdraw 3 view *)get next view(pos);
如果(ar。IsStoring())
{
//存储数据
ar pView-人类;
}
其他
{
//获取数据
ar pView-人类;
}
}
这样我们每次保存数据都可以用二进制序列化保存,每次打开都可以打开上次保存的内容。
如果people*是一个数组,比如这样
那么我们在使用序列化访问的时候,首先要访问数组的长度,回收数组的内容。
void cdraw 3 doc:Serialize(car chive ar)
{
//取出链表中第一个视图的位置
POSITION pos=GetFirstViewPosition();
//通过位置获取此视图
cdraw 3 view * pView=(cdraw 3 view *)get next view(pos);
//获取数组长度
int cnt=pView-human。GetSize();
如果(ar。IsStoring())
{
//存储数据
ar cnt
for(int I=0;我cnti ) {
//循环存储数组
ar视图-人类。GetAt(I);
}
}
其他
{
//取长度
ar cnt
for(int I=0;我cnti) {
//依次获取数据,并将其添加到数组中
人* p;
ar p;
pView-人类。添加(p);
}
}
}
到目前为止,本文对基于MFC的类的序列化的详细解释已经介绍到这里了。有关MFC类序列化的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望你以后能支持我们!