Serialization: Making a Serializable 클래스

5 단계는 클래스를 serialize 할 수 있게 해야 합니다.아래에 나열 되 고 다음 절에서 설명 합니다.

  1. Cobject에서 클래스를 파생 시키는 (또는 파생 된 일부 클래스에서 CObject).

  2. Serialize 멤버 함수를 재정의 합니다..

  3. DECLARE_SERIAL 매크로 사용 하 여 클래스를 선언 합니다.

  4. 인수가 없는 생성자 정의.

  5. 구현 파일에 IMPLEMENT_SERIAL 매크로 사용 하 여 클래스입니다.

호출 하는 경우 Serialize 직접 보다는-은 >> 및 << 연산자의 CArchive, 마지막 세 단계는 serialization에 대 한 필요 하지 않습니다.

Cobject에서 클래스를 파생합니다.

기능과 기본 serialization 프로토콜에 정의 되어 있는 CObject 클래스입니다.클래스에서 파생 하 여 CObject (또는 파생 된 클래스에서 CObject), 다음 클래스 선언에 표시 된 것 처럼 CPerson, serialization 프로토콜 및 기능을 액세스할 CObject.

재정의 하는 멤버 함수를 Serialize 합니다.

Serialize 에서 정의 하는 멤버 함수는 CObject 클래스, 개체의 현재 상태를 캡처하는 데 필요한 데이터가 실제로 serialize 하는 데 담당 합니다.Serialize 함수는 CArchive 개체 데이터 읽기 및 쓰기를 사용 하 여 인수 합니다.CArchive 개체 멤버 함수,이 IsStoring를 나타냅니다 여부 Serialize (데이터 쓰기)를 저장 또는 로드 (데이터 읽기).결과를 사용 하 여 IsStoring 안내서로, 하나를 개체의 데이터를 삽입 하 여는 CArchive 개체 삽입 연산자 (<<) 또는 추출 연산자와 데이터 추출 (>>).

클래스에서 파생 되는 것이 좋습니다 CObject 및 형식의 두 새 멤버 변수가 CString단어.다음 클래스 선언 부분 새 멤버 변수 및 재정의 대 한 선언을 보여 줍니다 Serialize 멤버 함수:

class CPerson : public CObject
{
public:
    DECLARE_SERIAL( CPerson )
    // empty constructor is necessary
    CPerson();
   virtual ~CPerson();

    CString m_name;
    WORD   m_number;

    void Serialize( CArchive& archive );
};

Serialize 멤버 함수를 재정의 하려면

  1. 기본 클래스 버전을 호출 합니다. Serialize 개체의 상속 된 부분이 serialize 될 수 있도록 합니다.

  2. 삽입 또는 클래스에 특정 멤버 변수에서 추출 합니다.

    삽입 및 추출 연산자는 데이터 읽기 및 쓰기에 보관 클래스와 상호 작용 합니다.다음 예제에서는 구현 하는 방법을 보여 줍니다. Serialize 에 CPerson 클래스 선언 위에서:

    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;
    }
    

사용할 수도 있습니다는 CArchive::ReadCArchive::Write 멤버 함수를 읽고 많은 형식화 되지 않은 데이터를 쓸 수 있습니다.

DECLARE_SERIAL 매크로 사용합니다.

DECLARE_SERIAL 매크로 serialization을 지 원하는 클래스의 선언에 필요한 다음과 같은:

class CPerson : public CObject
{
public:
    DECLARE_SERIAL( CPerson )

인수가 없는 생성자를 정의합니다.

(디스크에서 로드) 역직렬화 할 때 해당 개체를 다시 만들 때 MFC의 기본 생성자가 필요 합니다.Deserialization 프로세스는 모든 멤버 변수에 개체를 다시 만드는 데 필요한 값으로 채웁니다.

이 생성자는 공개, 개인 또는 보호를 선언할 수 있습니다.보호 된 또는 개인 확인을는 serialization 함수에 의해 사용 됩니다 있는지 확인 해.생성자 개체가 필요한 경우 삭제할 수 있도록 하는 상태에서 넣어야 합니다.

[!참고]

인수가 없는 생성자를 사용 하는 클래스에서 정의 하는 것을 잊어버린 경우는 DECLARE_SERIALIMPLEMENT_SERIAL 매크로 사용 됩니다 get "사용할 수 있는 기본 생성자 없음" 컴파일러 경고 줄에 위치는 IMPLEMENT_SERIAL 매크로 사용 합니다.

구현 파일에 IMPLEMENT_SERIAL 매크로 사용 하 여

IMPLEMENT_SERIAL 매크로 필요한 때 하면 파생 클래스에서 serialize 할 수 있는 다양 한 기능을 정의 하는 데 사용 CObject.이 매크로 사용 하 여의 구현 파일 (.CPP) 클래스입니다.처음 두 개의 인수에 매크로 해당 직접 기본 클래스의 이름과 클래스의 이름입니다.

이 매크로 세 번째 인수는 스키마 번호입니다.스키마 개체 클래스에 대 한 버전 번호가입니다.스키마 번호는 0 보다 크거나 같은 정수를 사용 합니다.(이 스키마 번호 데이터베이스 용어와 혼동 하지 마십시오.)

MFC serialization 코드는 메모리에 개체를 읽을 때 스키마 번호를 확인 합니다.스키마 번호 디스크 개체의 메모리에 있는 클래스 스키마 수가 일치 하지 않으면, 라이브러리 throw 합니다는 CArchiveException, 프로그램이 잘못 된 버전의 개체를 읽는 것을 방지 합니다.

원하는 경우에 Serialize 멤버 함수의 여러 버전을 읽을 수 있도록 — 응용 프로그램의 다른 버전으로 작성 된 파일-값을 사용할 수 있습니다 VERSIONABLE_SCHEMA 인수로 IMPLEMENT_SERIAL 매크로.사용 정보 및 예제에 대 한 참조를 GetObjectSchema 클래스의 멤버 함수 CArchive.

다음 예제에서는 사용 하는 방법을 보여 줍니다. IMPLEMENT_SERIAL 클래스인 CPerson, 즉 파생 CObject:

IMPLEMENT_SERIAL( CPerson, CObject, 1 )

클래스를 serialize 할 수 있으면이 문서에서 설명 하는 대로 클래스의 개체를 serialize 있습니다 직렬화: 객체 직렬화.

참고 항목

개념

Mfc serialization