MFC CArchive Serialize 시리얼화된 클래스 설계 및 사용

서열화의 출발점은 한 대상의 현재 상태는 영구적으로 저장될 수 있어야 한다는 것이다. 이러한 현재 상태는 주로 그의 구성원 변수로 표시된다.그리고 이 대상은 파일을 읽거나 역렬로 재구성할 수 있다.서열화는 모든 대상의 바늘 디테일을 처리하고 서열화된 대상을 처리하는 과정에서 사용하는 대상의 순환 인용을 포함한다.서열화의 관건은 한 대상이 자신의 상태의 읽기와 쓰기를 책임지는 데 있기 때문에 서열화 가능한 클래스는 반드시 기본적인 서열화 작업을 실현해야 한다.서열화 시리즈에서 보듯이 한 종류에 서열화 기능을 추가하는 과정은 복잡하지 않다.MFC는 CArchive 클래스를 서열화 대상과 저장 매체 사이의 브리지로 삼았다.CArchive 클래스 객체는 항상 Cfile 객체와 연결됩니다. (Cfile 파일은 디스크 파일일 수도 있고 메모리 파일일 수도 있고 클립보드 파일일 수도 있습니다!)Cfile 객체에서 CArchive 클래스 객체는 파일 이름 저장과 읽기/쓰기 작업을 포함하여 필요한 시리얼화된 정보를 얻을 수 있습니다.하나의 대상은CArchive 대상을 사용하여 서열화 작업을 할 수 있는데, 이 과정은 저장 매체와 무관하다.
1. 클래스를 시리얼화할 수 있는 5단계를 설계합니다.
CObject 클래스에서 자체 클래스 파생Serialize() 함수 다시 로드클래스 설명에 DECLARE 사용SERIAL 매크로매개 변수가 없는 구조 함수를 정의합니다. (대상을 재구성할 때 사용합니다.) 클래스 구현 파일에 IMPLEMENT 추가SERIAL 매크로만약 당신이 직접 Serialize () 함수를 사용하고 CArchive의 <<와 > 조작부호를 사용하지 않는다면, 뒤의 3단계를 줄일 수 있습니다.
하나의 실례는 다음과 같다. 하나의 CPerson 클래스에 두 개의 데이터 구성원이 있다.
class CPerson : public CObject 1  { public:    DECLARE_SERIAL( CPerson ) 3    // empty constructor is necessary    CPerson(){}; 4    CString m_name;    WORD   m_number;    void Serialize( CArchive& archive ); 2       // rest of class declaration };
 .cpp 
IMPLEMENT_SERIAL( CPerson, CObject, 1 ) 5
void CPerson::Serialize( CArchive& archive ) {    // call base class function first    // base class is CObject in this case
    CObject::Serialize( archive );    // now do the stuff for our specific class    if( archive.IsStoring() )        archive << m_name << m_number;    else        archive >> m_name >> m_number; }

IMPLEMENT_세 번째 파라미터는 버전 코드입니다. 데이터를 메모리에 읽을 때 시스템은 이 버전 코드를 검사합니다. 디스크와 메모리의 버전 코드가 다르면 시스템에서carchiveException 이상을 던져서 프로그램이 잘못된 대상의 데이터 버전을 읽지 못하게 합니다.비고: 여러 버전의 데이터를 읽는 문제를 해결합니다!!!!2. 하나의 CArchive 대상을 만들고 하나의 CAchive 대상을 만드는 두 가지 방법이 있다. 1.MFC의 document/View 프레임워크에 있는 Serialize 함수를 사용합니다. 이것을 암시적 생성이라고 합니다.2. 작성 표시는 Cfile 객체와 직접 연관된 객체를 나타냅니다.스텔스 방법은 프레임워크에 있는 CMyDocument 클래스의serialize()를 직접 사용하는 것이다. 여기서 강조하고자 하는 것은 CMyDocumen-t에 포함된 클래스 구성원이 있다면 이 클래스도 직렬화 능력이 있어야 한다. 그렇지 않으면 사용자가 스스로 이 기능을 추가해야 한다.어떻게 직렬화된 클래스를 만드는지 위에서 분명히 말했습니다!생성 방법을 표시하려면 다음과 같이 하십시오. 1.다른 이름으로 저장 대화 상자를 열고 파일 이름을 가져옵니다. 2.CFile 대상이 이 파일을 열었다는 것을 설명합니다 3.CArchive 객체와 CFile 객체에 대한 설명 4.Serialize () 함수를 호출하여 이 CArchive 대상을 매개 변수로 추상적으로 전달합니다. 다음은 구체적인 예입니다. const char szFilter[] = "MIMA Files (*.cy)|*.cy|; *.cy||";         CFileDialog fileDlg(false,".cy","mmmanager",OFN_HIDEREADONLY|OFN_OVERWRITEP ROMPT,szFilter); 1         CString strFileName;         CFile file;         if(IDOK == fileDlg.DoModal())         {             strFileName = fileDlg.GetFileName();             file.Open(strFileName,CFile::modeCreate | CFile::modeWrite); 2             CArchive ar(&file,CArchive::store); 3             m_objMM.Serialize(ar); 4         } 네 번째 단계에서 지적하고자 하는 것은 이 Serialize () 함수는 여기에서 호출할 수만 있다면 누구든지 호출할 수 있다.일반적인 Serialize () 함수 템플릿은 이렇게 생겼습니다:void Cperson:: Serialize (Carchive &ar) {CObject:: Serialize (ar);if (ar.IsStoring () {// TODO: add storing code here ar<...   }    else    {    // TODO:  add loading code here ar>>... } 3. 직렬화 CObject 대상 <<<와>> 조작부호는 간단한 데이터 형식에만 사용되며, 한 대상(또는 대상의 바늘)을 직렬화하면 이 대상의 Serialize() 함수를 직접 사용합니다.

좋은 웹페이지 즐겨찾기