MFC CArchive Serialize 시리얼화된 클래스 설계 및 사용
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() 함수를 직접 사용합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[프로세스 간 통신] 오일 탱크를 이용하여 프로세스 간의 통신을 실현하다2: 연결이 없는 신뢰할 수 없는 데이터 전송 4: 오일 탱크의 서버 프로세스 읽기, 클라이언트 프로세스 쓰기 "데이터 수신", IDM_MAILSLOT_RECE,view에서 메뉴에 명령 응답 추가 2: 응답 함수에서...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.