【上位机——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 分钟前
嵌入式开发中的栈与队列:任务调度为什么依赖数据结构
数据结构·c++·单片机·嵌入式硬件
故乡de云22 分钟前
AWS 添加付款方式失败排查清单:卡片、银行风控与账号状态逐项定位
开发语言·php
J_yyy29 分钟前
【Qt核心组件类框架】
开发语言·qt
txzrxz40 分钟前
单调队列讲解
数据结构·c++·算法·单调队列
运维行者_44 分钟前
如何查看每个IP的带宽使用情况?NetFlow 技术实战指南
开发语言·网络·分布式·后端·架构·带宽
天天进步20151 小时前
Python全栈项目--基于深度学习的图像超分辨率系统
开发语言·python·深度学习
WWTYYDS_6661 小时前
JsonCpp超详细使用教程
c++
Joey_friends2 小时前
指纹authenticate流程图
android·java·c++
小小晓.2 小时前
C++小白记:C风格字符串和数组用法
c语言·开发语言·c++
Helen_cai2 小时前
OpenHarmony 项目统一全局样式、尺寸、色彩主题封装 ThemeUtil(API23)
开发语言·前端·javascript·华为·harmonyos