使用MFC序列化的步骤,带版本控制兼容之前的版本.
- 需要直接或间接从 CObject 派生类.
- 派生类中声明中声明支持序列化的宏 DECLARE_SERIALE
- 派生类重写基类的 Serialize 函数
- 派生类必须有一个无参数的默认构造函数
- 派生类实现支持序列化的宏 IMPLEMENT_SERIALE
示例代码
#pragma once
#include <afx.h>
class CCar : public CObject {
DECLARE_SERIAL(CCar)
public:
CCar();
void Serialize(CArchive& ar);
public:
CPoint m_Location;
COLORREF m_Color;
int m_Speed;
};
#include "pch.h"
#include "CCar.h"
IMPLEMENT_SERIAL(CCar, CObject, VERSIONABLE_SCHEMA | 2);
CCar::CCar()
: CObject(), m_Location({0}), m_Color(COLORREF(0)), m_Speed(0) {
}
void CCar::Serialize(CArchive& ar) {
CObject::Serialize(ar);
if (ar.IsStoring()) {
ar << m_Location << m_Color << m_Speed;
}
else {
UINT nSchema = ar.GetObjectSchema();
switch (nSchema) {
case 1:
ar >> m_Location >> m_Color;
m_Speed = 200;
break;
case 2:
ar >> m_Location >> m_Color >> m_Speed;
break;
default:
AfxThrowArchiveException(CArchiveException::badSchema);
}
}
}
void CMFCSerializeDlg::OnBnClickedButton1() {
CCar car;
car.m_Location = { 100,200 };
car.m_Color = RGB(255, 0, 0);
car.m_Speed = 100;
CFile file(L"Car.data", CFile::modeCreate | CFile::modeWrite);
CArchive ar(&file, CArchive::store);
ar << &car;
ar.Close();
}
void CMFCSerializeDlg::OnBnClickedButton2() {
CCar* car;
CFile file(L"Car.data", CFile::modeRead);
CArchive ar(&file, CArchive::load);
ar >> car;
TRACE(L"Location:%d,%d Color:%d Speed:%d\n", car->m_Location.x, car->m_Location.y, car->m_Color, car->m_Speed);
}