【上位机——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;
}
相关推荐
wjs20242 分钟前
PHP Misc
开发语言
Highcharts.js3 分钟前
Next.js 集成 Highcharts 官网文档说明(2025 新版)
开发语言·前端·javascript·react.js·开发文档·next.js·highcharts
CodeByV3 分钟前
【Qt】信号与槽
开发语言·qt
爱学习的阿磊4 分钟前
模板代码跨编译器兼容
开发语言·c++·算法
fqbqrr5 分钟前
2601Mfc,自动化excel
自动化·excel·mfc
带鱼吃猫8 分钟前
C++STL:从 0 到 1 手写 C++ string以及高频易错点复盘
开发语言·c++
u01092727110 分钟前
代码覆盖率工具实战
开发语言·c++·算法
码云数智-大飞13 分钟前
零拷贝 IPC:用内存映射文件打造 .NET 高性能进程间通信队列
java·开发语言·网络
懈尘16 分钟前
深入理解Java的HashMap扩容机制
java·开发语言·数据结构
Beginner x_u18 分钟前
JavaScript 核心知识索引(面试向)
开发语言·javascript·面试·八股