【上位机——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;
}
相关推荐
「QT(C++)开发工程师」6 小时前
C++11 std::unique_ptr — 独占所有权的智能指针
c语言·开发语言·c++·qt
不正经学生7 小时前
C语言动态内存管理(上):堆上的自由与责任
c语言·开发语言·c++·算法·面试
AI情绪识别开源7 小时前
检信AI高一分班分科智选评估系统 v2.0测试报告
开发语言·数据结构·人工智能·科技
纯.Pure_Jin(g)7 小时前
靶场PHP函数整理+防御方式
开发语言·php·ctf
zl.rs7 小时前
配置更适合生产环境的coredump
c++
海兰8 小时前
【 Python 量化交易】第3章:金融基础概念
开发语言·python·金融
一木 之林8 小时前
三.C++ 内存管理(进阶)(二)
开发语言·arm开发·c++
吴声子夜歌8 小时前
Java——类、对象及方法(一)
java·开发语言
阿里嘎多学长8 小时前
2026-08-29 GitHub 热点项目精选
开发语言·程序员·github·代码托管
DLite8 小时前
开源一个静态类型语言——NLang
c++·编译器·nlang