【上位机——MFC】序列化机制

相关类

CFile-文件操作类,封装了关于文件读写等操作

CFile::Open

CFile::Write/Read

CFile::Close

CFile::SeekToBegin / SeekToEnd / Seek

代码示例

cpp 复制代码
#include <afxwin.h>
#include <iostream>

using namespace std;

void File() {
	CFile file;
	file.Open("E:/MFC/MFCDay02/file.txt",CFile::modeCreate | CFile::modeReadWrite);
	char str[] = "hello file";

	file.Write(str,strlen(str));
	file.SeekToBegin();

	char buf[256] = { 0 };
	long nLen = file.Read(buf,256);
	cout << buf << ' ' << nLen << endl;

}

int main() {
	File();

	return 0;
}

序列化机制的作用

以二进制流形式读写硬盘文件,但效率很高。

CFile文件操作类,完成硬盘文件的读写操作。

CArchive-归档类,完成内存数据的读写操作。

序列化变量

序列化机制的使用

  1. 创建或打开文件 CFile::Open
  2. 定义归档类对象 CArchive ar
  3. 数据序列化 ar << 数据
  4. 关闭归档类对象 ar.Close()
  5. 关闭文件 CFile::Close();

反序列化机制的使用

  1. 打开文件 CFile::Open
  2. 定义归档类对象 CArchive ar
  3. 数据反序列化 ar >> 变量
  4. 关闭归档类对象 ar.Close()
  5. 关闭文件 CFile::Close();

代码示例

cpp 复制代码
#include <afxwin.h>
#include <iostream>

using namespace std;

//序列化
void Store() {
	CFile file;
	file.Open("E:/MFC/MFCDay02/serial.txt", CFile::modeCreate | CFile::modeWrite);

	CArchive ar(&file, CArchive::store,4096);
	long age = 18;
	ar << age;
	float score = 88.5;
	ar << score;
	CString name = "zhangsan";
	ar << name;
	ar.Close();
	file.Close();

}

//反序列化
void Load() {
	CFile file;
	file.Open("E:/MFC/MFCDay02/serial.txt", CFile::modeRead);
	CArchive ar(&file, CArchive::load, 4096);
	long age;
	ar >> age;
	float score;
	ar >> score;
	CString name;
	ar >> name;

	cout << "age " << age << " score " << score <<" name "<< name << endl;

}


int main() {

	//Store();

	Load();

	return 0;
}

序列化对象的使用

  1. 类必须派生自CObject
  2. 类内必须添加声明宏 DECLARE_SERIAL(theClass)
  3. 类外必须添加实现宏 IMPLEMENT_SERIAL(theClass,baseClass,1)
  4. 类必须重写虚函数Serialize
    当类具备上述三个要件后,类对象就可以序列化到文件中保存了。
cpp 复制代码
#include <afxwin.h>
#include <iostream>

using namespace std;

//1.类必须派生自CObject
class CMyDoc :public CDocument {
	//2.类内必须添加声明宏 DECLARE_SERIAL(theClass)
	DECLARE_SERIAL(CMyDoc)

public:
	CMyDoc(int age = 0, float score = 0.0, CString name = "") :
		m_age(age), m_score(score), m_name(name) {
	};
	
	int m_age;
	float m_score;
	CString m_name;
	//4.类必须重写虚函数Serialize
	virtual void Serialize(CArchive& ar);

};
//3.类外必须添加实现宏 IMPLEMENT_SERIAL(theClass,baseClass,1)
IMPLEMENT_SERIAL(CMyDoc,CDocument,1)

void CMyDoc::Serialize(CArchive& ar) {
	if (ar.IsStoring()) {
		ar << m_age << m_score << m_name;
	}
	else {
		ar >> m_age >> m_score >> m_name;
	}
}


void Store() {

	CFile file;
	file.Open("E:/MFC/MFCDay02/serial.txt", CFile::modeCreate | CFile::modeWrite);

	CArchive ar(&file, CArchive::store, 4096);
	CMyDoc data(18, 88.5, "zhangsan");
	ar << &data;
	ar.Close();
	file.Close();


}

void Load() {

	CFile file;
	file.Open("E:/MFC/MFCDay02/serial.txt", CFile::modeRead);
	CArchive ar(&file, CArchive::load, 4096);

	CMyDoc* pdata = NULL;
	ar >> pdata;
	ar.Close();
	file.Close();
	cout << pdata->m_age <<' ' << pdata->m_score << ' ' << pdata->m_name << endl;
}


int main() {

	//Store();

	Load();

	return 0;
}
相关推荐
陈文锦丫1 天前
MQ的学习
java·开发语言
liwulin05061 天前
【PYTHON-YOLOV8N】如何自定义数据集
开发语言·python·yolo
神仙别闹1 天前
基于QT(C++)实现学本科教务系统(URP系统)
数据库·c++·qt
青蛙大侠公主1 天前
Thread及其相关类
java·开发语言
爱吃大芒果1 天前
Flutter 主题与深色模式:全局样式统一与动态切换
开发语言·javascript·flutter·ecmascript·gitcode
云栖梦泽1 天前
易语言数据库操作:结构化数据管理的核心
开发语言
deng-c-f1 天前
Linux C/C++ 学习日记(49):线程池
c++·学习·线程池
电子硬件笔记1 天前
Python语言编程导论第七章 数据结构
开发语言·数据结构·python
南棱笑笑生1 天前
20251217给飞凌OK3588-C开发板适配Rockchip原厂的Buildroot【linux-5.10】后调通ov5645【只能预览】
linux·c语言·开发语言·rockchip
ulias2121 天前
C++ 的容器适配器——从stack/queue看
开发语言·c++