#24. Seriailization (직렬화) 란? (2nd.)

어떤 뷰를 사용하느냐에 따라서 프로젝트에 생성되는 Document 클래스에서의 직렬화 방법이 모두 달라지게 되어있습니다. 각 뷰마다의 특성을 최대한 잘 살린 직렬화 방법을 이용하여 최적화된 파일 스토리지 또는 파일 로드 코드를 완성할 수 있도록 해줍니다.


CView나 CScrollView와 같은 경우 모두 Device Context를 사용하게 되어있습니다. 이런 뷰에서의 직렬화 방법은 가장 손쉬운 편집 방법을 제공하여 줍니다. 또한 직렬화의 의미를 가장 확실히 알 수 있는 뷰이기도 합니다.


이와 같은 뷰에서는 오버라이드된 직렬화 함수에 다음과 같은 조건문이 서술되어있습니다.



    if(ar.IsStoring())


    {


    // Add storing code here


    }


    else


    {


    // Add loading code here


    }


직렬화 함수에 주어진 파라메터로서는 CArchive &ar 이라는 것이 있는데 이것을 사용하여 직접 직렬화를 하게 되어있습니다. 그렇다면, 실제로 여기에 어떤 직렬화 구문을 사용해야 하는지 알아보겠습니다.


CArvhice 클래스의 연산자 오버로딩 중에는 <<와 >>같은 연산자를 사용하도록 되어있습니다. 이것은 데이터 스트림을 가리키는 연산자로서 이전에 TC++에서 cout에서 사용되어졌던 것입니다. 그 때 사용했던 기억을 되살리면 쉽게 사용이 가능합니다.


예를 들어 도큐먼트 클래스에 저장된 좌표 변수가 존재한다고 하였을 때 저장 과정시 사용되는 직렬화 코드는 다음과 같습니다.


ar<<m_nPointData;


그리고 이것은 다시 아래처럼 로딩이 가능합니다.


ar>>m_nPointData;


즉, 데이터 스트림을 어떻게 흘려보내느냐에 따라서 직렬화의 의미가 달라지게 되는 것입니다. 가장 이해하기가 편리하고 수월한 직렬화 구문이라고 할 수 있겠습니다.


실제로 적용된 조건문을 살펴보도록 합시다.



    if(ar.IsStoring())


    {


    // Add storing code here.


    ar<<m_nPointData;


    }


    else


    {


    // Add loading code here.


    ar>>m_nPointData;


    }


참고로 이러한 직렬화 과정은 파일 처리에서 가장 중요한 부분이며 이것만 완성해주면 실제로 파일 다이얼로그를 띄워준다거나 하는 사용자 정의 프로그래밍 과정이 특별하지 아니한 경우에는 전혀 필요없게 됩니다.


다음 강좌에서는 CEditView와 같은 텍스트 전용 처리 뷰에서의 직렬화에 대한 내용을 다루겠습니다.  

댓글 남기기