【上位机——MFC】序列化机制
相关类
CFile-文件操作类,封装了关于文件读写等操作
CFile::Open
CFile::Write/Read
CFile::Close
CFile::SeekToBegin / SeekToEnd / Seek
代码示例
#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-归档类,完成内存数据的读写操作。
序列化变量
序列化机制的使用
- 创建或打开文件 CFile::Open
- 定义归档类对象 CArchive ar
- 数据序列化 ar << 数据
- 关闭归档类对象 ar.Close()
- 关闭文件 CFile::Close();
反序列化机制的使用
- 打开文件 CFile::Open
- 定义归档类对象 CArchive ar
- 数据反序列化 ar >> 变量
- 关闭归档类对象 ar.Close()
- 关闭文件 CFile::Close();
代码示例
#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;
}
序列化对象的使用
- 类必须派生自CObject
- 类内必须添加声明宏 DECLARE_SERIAL(theClass)
- 类外必须添加实现宏 IMPLEMENT_SERIAL(theClass,baseClass,1)
- 类必须重写虚函数Serialize
当类具备上述三个要件后,类对象就可以序列化到文件中保存了。
#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.类必须重写虚函数Serializevirtual 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;
}