#22. Seriailization (직렬화) 란? (1st.)

Microsoft Foundation Classes (Application Frameworks, 이하 AFX) 기반으로 작성된 프로그램들은 파일을 저장하고 읽을 때에는 다른 함수들을 별도로 쓰지는 않습니다. 실제로 프로젝트를 열어서 CDocument에 관한 파일 저장 구문은 아무것도 보이지 않습니다. 다만 CDocument 클래스의 멤버 함수인 CDocument::Serialize(CArchive &ar) 외에는 없습니다.


이 함수가 하는 일은 파일을 읽고 쓰고 하는 기능 외에는 없습니다. 어차피 제대로된 직렬화를 대행하는 곳은 다른 어느곳도 아닌 직속 상위 클래스인 CDocument 클래스입니다. 직렬화의 원리에 대해서 설명을 드리겠습니다.


직렬화라는 말 자체가 직렬로 데이터를 처리한다라는 의미를 가진다는 것을 눈치가 빠르다면 쉽게 알아챌 수 있습니다. 데이터를 직렬로 정렬하여 일괄적으로 처리하는 방법입니다. 직렬화된 데이터를 어느 방향으로 (어느 데이터 흐름으로) 흘러서 처리할 거냐는 것이 파일 열기/쓰기의 결정 방법입니다.


직렬화 코딩 시 파일을 열 때와 파일을 저장할 때가 if/else 문으로 구분되어져 처리됩니다. 뷰가 어떤 뷰인지에 따라서 이 직렬화 함수 조건 처리 인터페이스가 달라지게 됩니다. Device Context를 이용해야 하는 어플리케이션일 경우 DC에 그려진 도형 변수들에 대하여 직렬화를 적용시키면 될 것이고 CEditView나 CRichEditView와 같은 텍스트를 취급하는 뷰에서는 직렬화에 대해서 전혀 건드릴 것은 없습니다. 다만, CRichEditView와 같은 경우 직렬화 방법에 대해서 생성자나 직렬화 함수 자체에서 다음 코드를 사용하여 RTF 문서를 처리할 지 텍스트 문서를 처리할 지 지정할 수 있습니다.


CRichEditDoc::m_bRTF = FALSE; // 텍스트로서 직렬화 작업을 한다.


CRichEditDoc::m_bRTF = TRUE; // RTF로서 직렬화 작업을 한다. (기본값)


직렬화를 위해서 따로 작성된 파일 처리 클래스가 있습니다. 이것은 기존의 FILE 구조체나 Win32 파일 핸들러나 CFile 클래스와는 그 의미가 다릅니다.


CArchive 클래스는 어떤 클래스로부터 상속되어진 것이 아닌 그 자체의 클래스일 뿐입니다. 비록 이 클래스가 직렬화 작업때에만 쓰여지는 것은 아니지만 일반적인 경우 직렬화에서 응용됩니다.


CArchive 클래스의 매력적인 특징 중에 하나는 읽어오거나 저장할 파일의 데이터 타입을 자기 스스로가 인지할 수 있다는 것입니다. 예를 들면 처리하고자 하는 파일이 바이너리인가, 텍스트 (스트링)인가를 구분할 수 있습니다.


완벽 가이드에서 네트워크 어플리케이션 작업 예제를 보면 실제로 파일을 네트워크 상에서 주고받을 때 이 CArchive나 이 클래스 밑으로 파생된 전용 클래스들을 이용하게 됩니다. 그 이유는 위에서 언급했던 파일 구분 능력덕인데 네트워크를 조금 더 공부해보면 왜 위에서 언급하였던 구분 능력이 필수적인가를 알 수 있을 것입니다.


이 직렬화를 구체적으로 알아나가기 위해서는 기존의 파일 처리 방법을 잘 인지하고 계셔야 할 것입니다. 또한, Windows의 경우 그 나름대로의 파일 시스템 (FAT (File Allocation Table), NTFS (New Technology File System), NFS (Network File System))의 구조를 잘 파악함은 물론 파일 액세스 법칙 및 우선 순위에 대한 개념을 습득해야 합니다.

#22. Seriailization (직렬화) 란? (1st.)”에 대한 4개의 생각

댓글 남기기