Fundamental Notes/MFC

MFC : 직렬화

콩콩댕 2009. 11. 30. 17:30
반응형

2. 직렬화(연속화)

프로그램이 만든 데이터를 보관하는 것을 흔히 저장(Save)이라고 하고 보관한 데이터를 다시 불러오는 작업을 복구(Load)라고 하는데, 비주얼C++ 에서는 이 두 과정을 합쳐서 직렬화(연속화(Serialization))라고 표현합니다.

데이터를 저장하고 불러오는 직렬화 작업은 많은 절차를 거쳐야만 합니다.

파일 이름을 입력 받아야 하고 입력 받은 파일을 열고 데이터를 읽어서 메모리에 넣어야 하는 기본 과정 외에도 수 많은 중간 과정들이 필요합니다.

 

위의 프로젝트에서 Doc 클래스에 가면 아래와 같은 코드가 있을 것입니다.

 

void CFileTestDoc::Serialize(CArchive& ar)

{

        if (ar.IsStoring())

        {

               // TODO: 여기에저장코드를추가합니다.

        }

        else

        {

               // TODO: 여기에로딩코드를추가합니다.

        }

}

 

이 함수가 파일 입출력을 수행하는 핵심함수입니다.

프레임워크가 자동으로 만들어 준 Serialize 함수는 아직 코드가 작성되어 있지 않은 빈 함수입니다.

하지만 프레임워크는 입출력이 필요할 경우 입출력에 필요한 모든 환경을 만든 후 이 함수를 호출해 주도록 준비를 하고 있습니다.

이 함수에 우리가 원하는 입출력 동작만 기술해 주면 나머지는 프레임워크가 알아서 수행해 주도록 되어 있습니다.

 


 

예제 프로젝트 생성

1. SDI 옵션으로 프로젝트 생성하는데 확장자를 test라고 입력합니다.

 

2. Doc 클래스에 문자를 저장할 변수 선언

CString str;

 

3. View 클래스의 WM_CHAR 메시지에 키보드 입력을 받아 str에 저장하는 코드 작성

CFileSerializeDoc* pDoc = GetDocument();

        CString msg;

        msg.Format(TEXT("%c"),nChar);

        pDoc->str += msg;

        Invalidate(TRUE);

 

4. View 클래스의 OnDraw에서 사용자가 입력한 문자열을 화면으로 출력하도록 작성

 

int length;

        length=pDoc->str.GetLength();

        pDC->TextOut (0,0,pDoc->str,length);

 

5. 기존의 내용을 삭제하는 코드를 작성해야 합니다.

편집하던 데이터를 삭제하는 함수는 CDocument::DeleteContents입니다.

이 함수가 하는 일을 정확하게 표현하면 Document 객체의 데이터를 삭제하는 일입니다.

이 함수는 다음 세가지 경우에 프레임워크가 직접 호출하도록 되어 있습니다.

File/New 명령으로 문서의 내용을 지우라고 명령 했을 때

File/Open 명령으로 새로운 데이터를 읽어 들이려 할 때

③도큐멘트 클래스가 파괴되기 직전

 

함수에 아래와 같은 내용을 작성합니다.

str = TEXT("");

 

6. 내용을 저장하는 코드를 작성합니다.

Doc 클래스의 Serialize 함수에 작성하면 됩니다.

if (ar.IsStoring())

        {

               ar << str;

               // TODO: 여기에저장코드를추가합니다.

        }

        else

        {

               ar >> str;

               // TODO: 여기에로딩코드를추가합니다.

        }

 

ar 객체는 디스크의 파일을 대표하는 객체이며 이 객체로 데이터를 보내주면 저장하는 것이되고 이 파일에서 데이터를 가져오면 읽어오는 것입니다.

데이터를 보낼 때는 << 연산자를 사용하며 읽을 때는 >> 연산자를 사용합니다.

이 함수가 호출되었을 때 저장을 위해 호출된 것인지 읽기를 위해 호출된 것인지를 알려면ar객체의 IsStoring 함수를 호출해보면 됩니다.

이 함수는 Serialize 함수가 저장을 위해 호출되었을 경우 TRUE를 리턴해 주며 읽기를 위해

호출되었을 경우 FALSE를 리턴해 줍니다.


 

7. 저장플래그

사용자가 데이터를 편집한 후 저장하지 않고 프로그램을 종료하려고 할 경우 저장이 안되었음을 경고해주는 기능입니다.

View 클래스의 OnChar 함수의 하단에 아래와 같은 코드를 추가합니다.

 

CFileSerializeDoc* pDoc = GetDocument();

        CString msg;

        msg.Format(TEXT("%c"),nChar);

        pDoc->str += msg;

        pDoc->SetModifiedFlag(TRUE);

        Invalidate(TRUE);

 

이제는 저장하지 않고 프로그램을 종료하려고 하면 대화상자가 화면에 출력되게 될 것입니다.

 

 

8. 직렬화가 가능한 데이터 형

분류

데이터형

정수

WORD, DWORD, BYTE, LONG

실수

double, float

클래스

CSize, CRect, CPoint, CTime, CTimeSpan, CString

포인터

CObject*