class CMyData : public CObject
{
DECLARE_SERIAL( CMyData) // 직렬화 선언
public:
CMyData();
virtual ~CMyData();
// 다음함수(Serialize)를 오버라이딩
virtual void Serialize( CArchive& archive );
int m_nValue; // 값1: 다이얼로그의 "IDC_EDIT1"에 해당
CString m_strValue; // 값2: 다이얼로그의 "IDC_EDIT2"에 해당
};
// MyData.cpp
#include "stdafx.h"
#include "SerializeTest.h"
#include "MyData.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
// 직렬화선언
IMPLEMENT_SERIAL( CMyData, CObject, 1)
////////////////////////////////////////////////////////
// Construction/Destruction
////////////////////////////////////////////////////////
CMyData::CMyData()
{
//멤버변수 초기화
m_nValue = 0;
}
CMyData::~CMyData()
{
}
// Serialize 함수를 오버라이딩(재정의)
void CMyData::Serialize( CArchive& ar)
{
// 부모클래스의 함수를 호출
CObject::Serialize( ar);
// 이클래스의 데이터를 보존
if( ar.IsLoading() == TRUE)
{
// 읽어올때
ar >> m_nValue >> m_strValue;
}
else
{
// 저장할때
ar << m_nValue << m_strValue;
}
}
다이얼로그 내용의 저장, 읽어오기 버튼의 클릭 이벤트 핸들러를 작성합니다.
(다이얼로그의 버튼상에서 더블 클릭)
아래와 같은 내용을 기술합니다.
// MyData.cpp:
//
///////////////////////////////////////////////////////
#include "MyData.h"
// 저장버튼 클릭시
void CSerializeTestDlg::OnButton1()
{
// TODO:
BOOL bret;
// 화면에 입력된 내용을 읽어서, 파일에 저장
CMyData data;
int nValue;
CString strValue;
// 값1은、int형으로 보존
nValue = (int)GetDlgItemInt( IDC_EDIT1);
GetDlgItemText( IDC_EDIT2, strValue);
data.m_nValue = nValue;
data.m_strValue = strValue;
// 파일을 쓰기모드로 오픈
CFile f;
bret = f.Open( "C:\\Temp\\MyData.dat",
CFile::modeCreate | CFile::modeWrite);
if( bret == FALSE)
{
AfxMessageBox( "파일열기 실패");
return;
}
CArchive ar( &f, CArchive::store);
TRY
{
data.Serialize( ar);
}
CATCH_ALL( e)
{
AfxMessageBox( "보존에러");
}
END_CATCH_ALL;
ar.Close();
f.Close();
// 화면내용을 초기화
SetDlgItemText( IDC_EDIT1, "");
SetDlgItemText( IDC_EDIT2, "");
}
// 읽어오기 버튼 클릭시
void CSerializeTestDlg::OnButton2()
{
// TODO:
// 파일을 엽니다.
BOOL bret;
CFile f;
bret = f.Open( "C:\\Temp\\MyData.dat", CFile::modeRead);
if( bret == FALSE)
{
AfxMessageBox( "파일열기 실패");
return;
}
CMyData data;
CArchive ar( &f, CArchive::load);
TRY
{
data.Serialize( ar);
}
CATCH_ALL( e)
{
AfxMessageBox( "보존에러");
}
END_CATCH_ALL;
ar.Close();
f.Close();
// 화면에 출력
SetDlgItemInt( IDC_EDIT1, data.m_nValue);
SetDlgItemText( IDC_EDIT2, data.m_strValue);
}
정리하면,
1) 화면의 내용을 읽어와서 CMyData의 멤버변수에 저장합니다. 그리고, CMyData 객체의 내용(멤버변수)을 파일에 저장합니다.
2) 파일을 열어서 저장된 내용을 가져온후, 이를 CMyData 객체의 내용으로 채웁니다