출처 -> www.codein.co.kr  프로그래머의 놀이터 (Code人)

 

MFC의 직렬화(Serialize)를 사용해, 오브젝트을 파일에 쓰고 읽는 방법에 대해 살펴보겠습니다.


소개할 기능은 기본적으로, 오브젝트의 현재 상태를 파일에 보존하거나 복원 하는 기능입니다.

 

1) MFC AppWizard를 사용해, 다이얼로그 기반의 프로젝트를 작성합니다.
메인 다이얼로그에 아래와 같이 컨트롤을 배치합니다.


(여기에서는, 프로젝트명을 Serialize Test 로서 작성했습니다.)

사용자 삽입 이미지

2) 새로운 클래스를 생성합니다.

클래스타입은 "Generic Class", 클래스명은 "CNewData" 이고, 부모클래스로 "CObject"를 지정합니다.

OK 버튼을 클릭해서, 클래스를 생성합니다.

사용자 삽입 이미지

 

// MyData.h

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 객체의 내용으로 채웁니다

+ Recent posts