영어로 읽기

다음을 통해 공유


CArchive 수업

이러한 개체를 삭제한 후에도 지속되는 영구 이진 형식(일반적으로 디스크 스토리지)에 복잡한 개체 네트워크를 저장할 수 있습니다.

구문

class CArchive

멤버

공용 생성자

속성 설명
CArchive::CArchive CArchive 개체를 만듭니다.

공용 메서드

이름 설명
CArchive::Abort 예외를 throw하지 않고 보관 파일을 닫습니다.
CArchive::Close 기록되지 않은 데이터를 플러시하고 .CFile
CArchive::Flush 보관 버퍼에서 기록되지 않은 데이터를 플러시합니다.
CArchive::GetFile 이 보관에 CFile 대한 개체 포인터를 가져옵니다.
CArchive::GetObjectSchema 역직렬화되는 개체의 버전을 확인하기 위해 함수에서 Serialize 호출됩니다.
CArchive::IsBufferEmpty Windows 소켓 수신 프로세스 중에 버퍼가 비워졌는지 여부를 확인합니다.
CArchive::IsLoading 보관 파일이 로드되고 있는지 여부를 확인합니다.
CArchive::IsStoring 보관 파일이 저장되고 있는지 여부를 확인합니다.
CArchive::MapObject 파일에 직렬화되지 않지만 하위 개체가 참조할 수 있는 개체를 맵에 배치합니다.
CArchive::Read 원시 바이트를 읽습니다.
CArchive::ReadClass 에 이전에 저장된 클래스 참조를 WriteClass읽습니다.
CArchive::ReadObject 로드를 위해 개체의 Serialize 함수를 호출합니다.
CArchive::ReadString 한 줄의 텍스트를 읽습니다.
CArchive::SerializeClass 의 방향CArchive에 따라 개체에 CArchive 대한 클래스 참조를 읽거나 씁니다.
CArchive::SetLoadParams 부하 배열이 증가하는 크기를 설정합니다. 개체를 로드하기 전이나 호출하기 전에 MapObject ReadObject 호출해야 합니다.
CArchive::SetObjectSchema 보관 개체에 저장된 개체 스키마를 설정합니다.
CArchive::SetStoreParams serialization 프로세스 중에 고유 개체를 식별하는 데 사용되는 맵의 해시 테이블 크기 및 블록 크기를 설정합니다.
CArchive::Write 원시 바이트를 씁니다.
CArchive::WriteClass 에 대한 참조를 CRuntimeClass CArchive씁니다.
CArchive::WriteObject 저장을 위해 개체의 Serialize 함수를 호출합니다.
CArchive::WriteString 한 줄의 텍스트를 씁니다.

Public 연산자

속성 설명
CArchive::operator << 보관에 개체 및 기본 형식을 저장합니다.
CArchive::operator >> 보관 파일에서 개체 및 기본 형식을 로드합니다.

공용 데이터 멤버

속성 설명
CArchive::m_pDocument

설명

CArchive 에는 기본 클래스가 없습니다.

나중에 영구 스토리지에서 개체를 로드하여 메모리에 다시 구성할 수 있습니다. 데이터를 영구적으로 만드는 이 프로세스를 "serialization"이라고 합니다.

보관 개체를 일종의 이진 스트림으로 생각할 수 있습니다. 입력/출력 스트림과 마찬가지로 보관 파일은 파일과 연결되며 버퍼링된 데이터 쓰기 및 스토리지에서 데이터 읽기를 허용합니다. 입력/출력 스트림은 ASCII 문자의 시퀀스를 처리하지만 보관 파일은 이진 개체 데이터를 효율적이고 대체되지 않은 형식으로 처리합니다.

개체를 CFile 만들려면 먼저 개체를 CArchive 만들어야 합니다. 또한 보관 파일의 로드/저장소 상태가 파일의 열기 모드와 호환되는지 확인해야 합니다. 파일당 하나의 활성 보관 파일로 제한됩니다.

개체를 생성할 때 열려 있는 CArchive 파일을 나타내는 클래스 CFile (또는 파생 클래스)의 개체에 연결합니다. 또한 보관을 로드 또는 저장에 사용할지 여부를 지정합니다. 개체는 CArchive 기본 형식뿐만 아니라 serialization을 위해 설계된 파생 클래스의 CObject개체도 처리할 수 있습니다. 직렬화 가능한 클래스에는 Serialize 일반적으로 멤버 함수가 있으며 일반적으로 클래스CObjectDECLARE_SERIAL 설명된 대로 및 IMPLEMENT_SERIAL 매크로를 사용합니다.

오버로드된 추출( >>) 및 삽입( <<) 연산자는 기본 형식과 CObject파생 클래스를 모두 지원하는 편리한 보관 프로그래밍 인터페이스입니다.

CArchive 또한 MFC Windows 소켓 클래스 및 .를 사용하여 프로그래밍을 지원합니다 CSocket CSocketFile. 멤버 함수는 IsBufferEmpty 해당 사용을 지원합니다.

자세한 CArchive내용은 직렬화Windows 소켓: 보관과 함께 소켓 사용 문서를 참조하세요.

상속 계층 구조

CArchive

요구 사항

머리글: afx.h

CArchive::Abort

이 함수를 호출하여 예외를 throw하지 않고 보관 파일을 닫습니다.

void Abort ();

설명

CArchive 소멸자는 일반적으로 호출Close되며 연결된 CFile 개체에 저장되지 않은 모든 데이터를 플러시합니다. 이로 인해 예외가 발생할 수 있습니다.

이러한 예외를 catch할 때 개체를 소멸 CArchive 해도 추가 예외가 발생하지 않도록 사용하는 Abort것이 좋습니다. 예외 CArchive::Abort 를 처리할 때는 오류와 달리 CArchive::CloseAbort 오류를 무시하므로 오류에 대한 예외를 throw하지 않습니다.

힙에 개체를 CArchive 할당하는 데 사용한 new 경우 파일을 닫은 후 삭제해야 합니다.

예시

CArchive::WriteClass에 대한 예를 참조하세요.

CArchive::CArchive

개체를 CArchive 생성하고 개체를 로드하거나 저장하는 데 사용할지 여부를 지정합니다.

CArchive(
    CFile* pFile,
    UINT nMode,
    int nBufSize = 4096,
    void* lpBuf = NULL);

매개 변수

pFile
영구 데이터의 최종 원본 또는 대상인 개체에 대한 포인터 CFile 입니다.

nMode
개체를 보관 파일에서 로드할지 또는 보관에 저장할지 여부를 지정하는 플래그입니다. 매개 변수에는 nMode 다음 값 중 하나가 있어야 합니다.

  • CArchive::load 보관 파일에서 데이터를 로드합니다. 읽기 권한만 CFile 필요합니다.

  • CArchive::store 보관 파일에 데이터를 저장합니다. CFile 쓰기 권한이 필요합니다.

  • CArchive::bNoFlushOnDelete 보관 소멸자가 호출되면 보관이 자동으로 호출 Flush 되지 않도록 합니다. 이 플래그를 설정하는 경우 소멸자가 호출되기 전에 명시적으로 호출 Close 해야 합니다. 그렇지 않으면 데이터가 손상됩니다.

nBufSize
내부 파일 버퍼의 크기를 바이트 단위로 지정하는 정수입니다. 기본 버퍼 크기는 4,096바이트입니다. 대용량 개체를 정기적으로 보관하는 경우 파일 버퍼 크기의 배수인 더 큰 버퍼 크기를 사용하는 경우 성능이 향상됩니다.

lpBuf
사용자가 제공한 크기의 버퍼에 대한 선택적 포인터입니다 nBufSize. 이 매개 변수를 지정하지 않으면 보관 파일은 로컬 힙에서 버퍼를 할당하고 개체가 제거되면 해제합니다. 보관 파일은 사용자가 제공한 버퍼를 해제하지 않습니다.

설명

보관 파일을 만든 후에는 이 사양을 변경할 수 없습니다.

보관 파일을 닫을 때까지 작업을 사용하여 CFile 파일 상태를 변경할 수 없습니다. 이러한 작업은 보관의 무결성을 손상합니다. 멤버 함수에서 GetFile 보관 파일 개체를 가져온 다음 함수를 사용하여 CFile::GetPosition serialization 중에 언제든지 파일 포인터의 위치에 액세스할 수 있습니다. 파일 포인터의 위치를 가져오기 전에 호출 CArchive::Flush 해야 합니다.

예시

CFile file;
TCHAR szBuf[512];
if (!file.Open(_T("CArchive__test__file.txt"),
               CFile::modeCreate | CFile::modeWrite))
{
#ifdef _DEBUG
   AFXDUMP(_T("Unable to open file\n"));
   exit(1);
#endif
}
CArchive ar(&file, CArchive::store, 512, szBuf);

CArchive::Close

버퍼에 남아 있는 모든 데이터를 플러시하고, 보관 파일을 닫고, 파일에서 보관 파일의 연결을 끊습니다.

void Close();

설명

보관에 대한 추가 작업은 허용되지 않습니다. 보관 파일을 닫은 후 동일한 파일에 대한 다른 보관 파일을 만들거나 파일을 닫을 수 있습니다.

멤버 함수 Close 는 모든 데이터를 보관 파일로 전송하고 보관을 사용할 수 없도록 합니다. 파일에서 스토리지 매체로 전송을 완료하려면 먼저 개체를 사용한 CFile::Close 다음 삭제 CFile 해야 합니다.

예시

CArchive::WriteString에 대한 예제를 참조하세요.

CArchive::Flush

보관 버퍼에 남아 있는 모든 데이터를 파일에 기록하도록 합니다.

void Flush();

설명

멤버 함수 Flush 는 모든 데이터가 보관 파일에서 파일로 전송되도록 합니다. 파일에서 스토리지 매체로 전송을 완료하려면 호출 CFile::Close 해야 합니다.

예시

CFile myFile(_T("CArchive__test__file.txt"),
             CFile::modeCreate | CFile::modeWrite);
CArchive ar(&myFile, CArchive::store);

// Write a string to the archive.
ar.WriteString(_T("My string."));

// Flush all of the data to the file.
ar.Flush();

CArchive::GetFile

이 보관에 CFile 대한 개체 포인터를 가져옵니다.

CFile* GetFile() const;

Return Value

사용 중인 개체에 대한 CFile 상수 포인터입니다.

설명

를 사용하기 GetFile전에 보관 파일을 플러시해야 합니다.

예시

const CFile *fp = ar.GetFile();

CArchive::GetObjectSchema

함수에서 이 함수를 Serialize 호출하여 현재 역직렬화 중인 개체의 버전을 확인합니다.

UINT GetObjectSchema();

Return Value

역직렬화하는 동안 읽는 개체의 버전입니다.

설명

이 함수를 호출하는 것은 개체가 CArchive 로드되는 경우에만 유효합니다( CArchive::IsLoading 0이 아닌 값을 반환). 함수의 첫 번째 호출 Serialize 이어야 하며 한 번만 호출됩니다. (UINT)-1의 반환 값은 버전 번호를 알 수 없음을 나타냅니다.

CObject-derived 클래스는 (매크로에서) 스키마 버전 자체와 결합된(IMPLEMENT_SERIAL비트"또는" (|)를 사용하여 VERSIONABLE_SCHEMA 멤버 함수가 여러 버전을 읽을 수 있는 Serialize 개체인 "버전 관리 가능한 개체"를 만들 수 있습니다. 기본 프레임워크 기능(제외 VERSIONABLE_SCHEMA)은 버전이 일치하지 않는 경우 예외를 throw하는 것입니다.

예시

IMPLEMENT_SERIAL(CSchemaObject, CObject, VERSIONABLE_SCHEMA | 1)

void CSchemaObject::Serialize(CArchive &ar)
{
   CObject::Serialize(ar);

   if (ar.IsLoading())
   {
      int nVersion = ar.GetObjectSchema();

      switch (nVersion)
      {
      case 0:
         // read in previous version of
         // this object
         break;
      case 1:
         // read in current version of
         // this object
         break;
      default:
         // report unknown version of
         // this object
         break;
      }
   }
   else
   {
      // Normal storing code goes here
   }
}

CArchive::IsBufferEmpty

이 멤버 함수를 호출하여 보관 개체의 내부 버퍼가 비어 있는지 여부를 확인합니다.

BOOL IsBufferEmpty() const;

Return Value

보관의 버퍼가 비어 있으면 0이 아닌 경우 그렇지 않으면 0입니다.

설명

이 함수는 MFC Windows 소켓 클래스 CSocketFile를 사용하여 프로그래밍을 지원하기 위해 제공됩니다. 개체와 CFile 연결된 보관 파일에는 사용할 필요가 없습니다.

개체와 연결된 CSocketFile 보관 파일을 사용하는 IsBufferEmpty 이유는 보관의 버퍼에 둘 이상의 메시지 또는 레코드가 포함될 수 있기 때문입니다. 하나의 메시지를 받은 후 버퍼가 비어 있는 때까지 데이터를 계속 수신하는 루프를 제어하는 데 사용해야 IsBufferEmpty 합니다. 자세한 내용은 사용하는 IsBufferEmpty방법을 보여주는 클래스CAsyncSocket의 멤버 함수를 참조 Receive 하세요.

자세한 내용은 Windows 소켓: 보관과 함께 소켓 사용.을 참조 하세요.

CArchive::IsLoading

보관에서 데이터를 로드하는지 여부를 확인합니다.

BOOL IsLoading() const;

Return Value

보관이 현재 로드에 사용되는 경우 0이 아닌 경우 그렇지 않으면 0입니다.

설명

이 멤버 함수는 보관된 클래스의 함수에 의해 Serialize 호출됩니다.

예시

int i = 0;
if (ar.IsLoading())
   ar >> i;
else
   ar << i;

CArchive::IsStoring

보관에서 데이터를 저장하고 있는지 여부를 확인합니다.

BOOL IsStoring() const;

Return Value

보관이 현재 저장에 사용되는 경우 0이 아닌 경우 그렇지 않으면 0입니다.

설명

이 멤버 함수는 보관된 클래스의 함수에 의해 Serialize 호출됩니다.

보관 상태가 IsStoring 0이 아닌 경우 해당 IsLoading 상태는 0이고 그 반대의 경우도 마찬가지입니다.

예시

int i = 0;
if (ar.IsStoring())
   ar << i;
else
   ar >> i;

CArchive::MapObject

이 멤버 함수를 호출하여 실제로 파일로 직렬화되지는 않지만 하위 개체가 참조할 수 있는 개체를 맵에 배치합니다.

void MapObject(const CObject* pOb);

매개 변수

pOb
저장되는 개체에 대한 상수 포인터입니다.

설명

예를 들어 문서를 직렬화하지 않을 수도 있지만 문서의 일부인 항목을 직렬화합니다. 호출 MapObject하면 해당 항목 또는 하위 개체가 문서를 참조할 수 있습니다. 또한 직렬화된 하위 항목은 해당 뒤로 포인터를 직렬화할 m_pDocument 수 있습니다.

개체에 저장하고 개체에서 로드할 때 호출 MapObjectCArchive 수 있습니다. MapObject는 직렬화 및 역직렬화 중에 개체가 CArchive 유지 관리하는 내부 데이터 구조에 지정된 개체를 추가하지만, 개체와 WriteObject달리 ReadObject 개체에서 serialize를 호출하지는 않습니다.

예시

//MyDocument.h
class CMyDocument : public CDocument
{
public:
   DECLARE_SERIAL(CMyDocument)

   CObList m_listOfSubItems;

   virtual void Serialize(CArchive &ar);
};

 

//MyDocument.cpp
IMPLEMENT_SERIAL(CMyDocument, CDocument, 1)

void CMyDocument::Serialize(CArchive& ar)
{
   CDocument::Serialize(ar);

   if (ar.IsStoring())
   {
      // TODO: add storing code here
   }
   else
   {
      // TODO: add loading code here
   }

   ar.MapObject(this);

   //serialize the subitems in the document;
   //they will be able to serialize their m_pDoc
   //back pointer
   m_listOfSubItems.Serialize(ar);
}

 

//SubItem.h
class CSubItem : public CObject
{
   DECLARE_SERIAL(CSubItem)
   CSubItem() : m_i(0){};

public:
   CSubItem(CMyDocument *pDoc)
   {
      m_pDoc = pDoc;
   }

   // back pointer to owning document
   CMyDocument *m_pDoc;
   WORD m_i; // other item data

   virtual void Serialize(CArchive &ar);
};

 

//SubItem.cpp
IMPLEMENT_SERIAL(CSubItem, CObject, 1);

void CSubItem::Serialize(CArchive &ar)

{
   if (ar.IsStoring())
   {
      // will serialize a reference
      // to the "mapped" document pointer
      ar << (CObject *)m_pDoc;
      ar << m_i;
   }
   else
   {
      // Will load a reference to
      // the "mapped" document pointer
      ar >> (CObject *&)m_pDoc;
      ar >> m_i;
   }
}

CArchive::m_pDocument

NULL 기본적으로 설정된 이 포인터는 CDocument 인스턴스 사용자가 CArchive 원하는 모든 항목으로 설정할 수 있습니다.

CDocument* m_pDocument;

설명

이 포인터의 일반적인 사용은 serialize되는 모든 개체에 serialization 프로세스에 대한 추가 정보를 전달하는 것입니다. 이 작업은 필요한 경우 문서 내의 개체가 문서에 액세스할 수 있도록 직렬화되는 문서( CDocument-파생 클래스)를 사용하여 포인터를 초기화하여 수행됩니다. 이 포인터는 serialization 중에 개체에서도 COleClientItem 사용됩니다.

프레임워크는 사용자가 파일 열기 또는 저장 명령을 실행하면 serialize되는 문서로 설정합니다 m_pDocument . 파일 열기 또는 저장 이외의 이유로 OLE(개체 연결 및 포함) 컨테이너 문서를 직렬화하는 경우 명시적으로 설정 m_pDocument해야 합니다. 예를 들어 컨테이너 문서를 클립보드로 직렬화할 때 이 작업을 수행합니다.

예시

CFile myFile(_T("My__test__file.dat"),
             CFile::modeCreate | CFile::modeWrite);
CArchive ar(&myFile, CArchive::store);
CMyDocument mydoc;
ar.m_pDocument = &mydoc;

// Serialize the document to the archive.
if (ar.m_pDocument != NULL)
   ar.m_pDocument->Serialize(ar);

CArchive::operator <<

표시된 개체 또는 기본 형식을 보관 파일에 저장합니다.

friend CArchive& operator<<(
    CArchive& ar,
    const CObject* pOb);

throw(
    CArchiveException*,
    CFileException*);

CArchive& AFXAPI operator<<(
    CArchive& ar,
    const RECT& rect);

CArchive& AFXAPI operator<<(
    CArchive& ar,
    POINT point);

CArchive& AFXAPI operator<<(
    CArchive& ar,
    SIZE size);

template<typename BaseType,
    class StringTraits> CArchive& operator<<(
    const ATL::CStringT<BaseType,
    StringTraits>& str);

CArchive& operator<<(BYTE by);
CArchive& operator<<(WORD w);
CArchive& operator<<(LONG l);
CArchive& operator<<(DWORD dw);
CArchive& operator<<(float f);
CArchive& operator<<(double d);
CArchive& operator<<(int i);
CArchive& operator<<(short w);
CArchive& operator<<(char ch);
CArchive& operator<<(wchar_t ch);
CArchive& operator<<(unsigned u);
CArchive& operator<<(bool b);
CArchive& operator<<(ULONGLONG dwdw);
CArchive& operator<<(LONGLONG dwdw);

Return Value

CArchive 한 줄에 여러 삽입 연산자를 사용하도록 설정하는 참조입니다.

설명

위의 마지막 두 버전은 특히 64비트 정수 저장을 위한 것입니다.

클래스 구현에서 매크로를 IMPLEMENT_SERIAL 사용한 경우 보호된 호출에 대해 CObject 삽입 연산자가 오버로드됩니다 WriteObject. 이 함수는 차례로 클래스의 함수를 Serialize 호출합니다.

삽입 연산자(<<)는 CStringT 진단 덤프 및 보관에 저장을 지원합니다.

예제

이 예제에서는 삽입 long 연산 << 자와 CArchive 형식을 사용하는 방법을 int 보여 줍니다.

long l = 5;
int i = 10;
if (ar.IsStoring())
   ar << l << i;

이 예제에서는 형식과 CArchive 함께 삽입 연산 << 자를 사용하는 방법을 보여 줍니다 CStringT .

CString s("abc");
ar << s; // Prints the value (abc)

CArchive::operator >>

아카이브에서 표시된 개체 또는 기본 형식을 로드합니다.

friend CArchive& operator>>(
    CArchive& ar,
    CObject *& pOb);

throw(
    CArchiveException*,
    CFileException*,
    CMemoryException*);

friend CArchive& operator>>(
    CArchive& ar,
    const CObject *& pOb);

throw(
    CArchiveException*,
    CFileException*,
    CMemoryException*);

CArchive& AFXAPI operator>>(
    CArchive& ar,
    const RECT& rect);

CArchive& AFXAPI operator>>(
    CArchive& ar,
    POINT point);

CArchive& AFXAPI operator>>(
    CArchive& ar,
    SIZE size);

template<typename BaseType,
    class StringTraits> CArchive& operator>>(
    ATL::CStringT<BaseType,
    StringTraits>& str);

CArchive& operator>>(BYTE& by);
CArchive& operator>>(WORD& w);
CArchive& operator>>(int& i);
CArchive& operator>>(LONG& l);
CArchive& operator>>(DWORD& dw);
CArchive& operator>>(float& f);
CArchive& operator>>(double& d);
CArchive& operator>>(short& w);
CArchive& operator>>(char& ch);
CArchive& operator>>(wchar_t& ch);
CArchive& operator>>(unsigned& u);
CArchive& operator>>(bool& b);
CArchive& operator>>(ULONGLONG& dwdw);
CArchive& operator>>(LONGLONG& dwdw);

Return Value

CArchive 한 줄에 여러 추출 연산자를 사용하도록 설정하는 참조입니다.

설명

위의 마지막 두 버전은 특히 64비트 정수 로드용입니다.

클래스 구현에서 매크로를 IMPLEMENT_SERIAL 사용한 경우 0이 아닌 런타임 클래스 포인터를 사용하여 보호된 함수를 호출하기 위해 CObject 추출 연산자가 오버로드됩니다 ReadObject . 이 함수는 차례로 클래스의 함수를 Serialize 호출합니다.

추출 연산자(>>)는 CStringT 보관 파일에서 로드를 지원합니다.

예제

이 예제에서는 형식과 CArchive 함께 추출 연산 >> 자를 사용하는 방법을 보여 줍니다 int .

long l;
int i;
if (ar.IsLoading())
   ar >> l >> i;

이 예제에서는 삽입 및 추출 연산 >> << 자와 형식을 사용하는 CArchive 방법을 보여 줍니다CStringT.

CString s;
if (ar.IsLoading())
   ar >> s;

CArchive::Read

보관 파일에서 지정된 바이트 수를 읽습니다.

UINT Read(void* lpBuf, UINT nMax);

매개 변수

lpBuf
보관 파일에서 읽은 데이터를 수신하는 사용자 제공 버퍼에 대한 포인터입니다.

nMax
보관 파일에서 읽을 바이트 수를 지정하는 부호 없는 정수입니다.

Return Value

실제로 읽은 바이트 수를 포함하는 부호 없는 정수입니다. 반환 값이 요청된 수보다 작으면 파일 끝에 도달했습니다. 파일 끝 조건에서 예외가 throw되지 않습니다.

설명

보관 파일은 바이트를 해석하지 않습니다.

함수 내 Serialize 의 멤버 함수를 Read 사용하여 개체에 포함된 일반 구조를 읽을 수 있습니다.

예시

char pbRead[100];
ar.Read(pbRead, 100);

CArchive::ReadClass

이 멤버 함수를 호출하여 이전에 저장한 WriteClass클래스에 대한 참조를 읽습니다.

CRuntimeClass* ReadClass(
    const CRuntimeClass* pClassRefRequested = NULL,
    UINT* pSchema = NULL,
    DWORD* pObTag = NULL);

매개 변수

pClassRefRequested
요청된 클래스 참조에 CRuntimeClass 해당하는 구조체에 대한 포인터입니다. NULL일 수 있습니다.

pSchema
이전에 저장한 런타임 클래스의 스키마에 대한 포인터입니다.

pObTag
개체의 고유 태그를 참조하는 숫자입니다. 의 구현 ReadObject에서 내부적으로 사용됩니다. 고급 프로그래밍 전용으로 노출됨; pObTag 는 이어야 NULL합니다.

Return Value

구조체에 대한 포인터입니다 CRuntimeClass .

설명

그렇지 않은 NULLReadClass 경우 pClassRefRequested 보관된 클래스 정보가 런타임 클래스와 호환되는지 확인합니다. 호환 ReadClass CArchiveException되지 않는 경우 .

런타임 클래스는 사용해야 DECLARE_SERIAL 하며, IMPLEMENT_SERIAL그렇지 않으면 ReadClass .를 CNotSupportedExceptionthrow합니다.

NULL경우 pSchema 저장된 클래스의 스키마를 호출CArchive::GetObjectSchema하여 검색할 수 있습니다. 그렇지 않으면 *pSchema 이전에 저장된 런타임 클래스의 스키마가 포함됩니다.

클래스 참조의 ReadClass읽기 및 쓰기를 모두 처리하는 대신 사용할 SerializeClass 수 있습니다.

예시

CArchive::WriteClass에 대한 예를 참조하세요.

CArchive::ReadObject

보관 파일에서 개체 데이터를 읽고 적절한 형식의 개체를 생성합니다.

CObject* ReadObject(const CRuntimeClass* pClass);

매개 변수

pClass
읽을 개체에 CRuntimeClass 해당하는 구조체에 대한 상수 포인터입니다.

Return Value

CObject 를 사용하여 CObject::IsKindOf올바른 파생 클래스로 안전하게 캐스팅해야 하는 포인터입니다.

설명

이 함수는 일반적으로 포인터에 CArchive 대해 오버로드된 추출( >>) 연산자에 의해 호출됩니다 CObject . ReadObject는 차례로 보관된 클래스의 함수를 호출 Serialize 합니다.

매크로에서 가져온 0 pClass 이 아닌 매개 변수를 RUNTIME_CLASS 제공하는 경우 함수는 보관된 개체의 런타임 클래스를 확인합니다. 이 경우 클래스의 구현에서 매크로를 사용했다고 IMPLEMENT_SERIAL 가정합니다.

예시

CArchive::WriteObject에 대한 예를 참조하세요.

CArchive::ReadString

이 멤버 함수를 호출하여 개체와 CArchive 연결된 파일에서 버퍼로 텍스트 데이터를 읽습니다.

BOOL ReadString(CString& rString);
LPTSTR ReadString(LPTSTR lpsz, UINT nMax);

매개 변수

rString
CString 개체와 연결된 CArchive 파일에서 읽은 후 결과 문자열을 포함하는 참조입니다.

lpsz
null로 끝나는 텍스트 문자열을 받을 사용자 제공 버퍼에 대한 포인터를 지정합니다.

nMax
읽을 최대 문자 수를 지정합니다. 버퍼 크기 lpsz 보다 작아야 합니다.

Return Value

BOOL TRUE 을 반환하는 버전에서 성공 FALSE 하면 그렇지 않습니다.

반환되는 LPTSTR버전에서는 텍스트 데이터가 NULL 포함된 버퍼에 대한 포인터입니다. 파일 끝에 도달한 경우입니다.

설명

매개 변수가 있는 nMax 멤버 함수의 버전에서 버퍼는 최대 1자의 제한을 nMax 유지합니다. 캐리지 리턴 라인 피드 쌍에 의해 읽기가 중지됩니다. 후행 줄다리기 문자는 항상 제거됩니다. NULL 두 경우 모두 문자('\0')가 추가됩니다.

CArchive::Read 는 텍스트 모드 입력에도 사용할 수 있지만 캐리지 리턴 라인 피드 쌍에서는 종료되지 않습니다.

예시

CArchive::WriteString에 대한 예를 참조하세요.

CArchive::SerializeClass

기본 클래스의 버전 정보를 저장하고 로드하려는 경우 이 멤버 함수를 호출합니다.

void SerializeClass(const CRuntimeClass* pClassRef);

매개 변수

pClassRef
기본 클래스의 런타임 클래스 개체에 대한 포인터입니다.

설명

SerializeClass의 방향CArchive에 따라 클래스 CArchive 에 대한 참조를 개체에 읽거나 씁니다. 기본 클래스 개체 SerializeClassReadClass WriteClass 직렬화하는 편리한 방법으로 대신 사용합니다SerializeClass. 코드가 적고 매개 변수가 적습니다.

SerializeClass 마찬가지로 ReadClass보관된 클래스 정보가 런타임 클래스와 호환되는지 확인합니다. 호환 SerializeClass CArchiveException되지 않는 경우 .

런타임 클래스는 사용해야 DECLARE_SERIAL 하며, IMPLEMENT_SERIAL그렇지 않으면 SerializeClass .를 CNotSupportedExceptionthrow합니다.

매크로를 RUNTIME_CLASS 사용하여 매개 변수의 값을 검색합니다 pRuntimeClass . 기본 클래스는 매크로를 IMPLEMENT_SERIAL 사용해야 합니다.

예시

class CBaseClass : public CObject
{
   DECLARE_SERIAL(CBaseClass);
};
class CDerivedClass : public CBaseClass
{
public:
   virtual void Serialize(CArchive &ar);
};
void CDerivedClass::Serialize(CArchive &ar)
{
   if (ar.IsStoring())
   {
      //normal code for storing contents
      //of this object
   }
   else
   {
      //normal code for reading contents
      //of this object
   }

   //allow the base class to serialize along
   //with its version information
   ar.SerializeClass(RUNTIME_CLASS(CBaseClass));
   CBaseClass::Serialize(ar);
}

CArchive::SetLoadParams

보관 파일에서 많은 수의 CObject파생 개체를 읽으려고 할 때 호출 SetLoadParams 합니다.

void SetLoadParams(UINT nGrowBy = 1024);

매개 변수

nGrowBy
크기 증가가 필요한 경우 할당할 요소 슬롯의 최소 수입니다.

설명

CArchive 에서는 부하 배열을 사용하여 보관에 저장된 개체에 대한 참조를 확인합니다. SetLoadParams 를 사용하면 부하 배열이 증가하는 크기를 설정할 수 있습니다.

개체가 로드되거나 호출된 후 MapObject ReadObject 호출해서는 SetLoadParams 안 됩니다.

예시

class CMyLargeDocument : public CDocument
{
public:
   virtual void Serialize(CArchive &ar);
};
void CMyLargeDocument::Serialize(CArchive &ar)
{
   if (ar.IsStoring())
      ar.SetStoreParams(); // use large defaults
   else
      ar.SetLoadParams();

   if (ar.IsStoring())
   {
      // code for storing CMyLargeDocument
   }
   else
   {
      // code for loading CMyLargeDocument
   }
}

CArchive::SetObjectSchema

이 멤버 함수를 호출하여 보관 nSchema개체에 저장된 개체 스키마를 .로 설정합니다.

void SetObjectSchema(UINT nSchema);

매개 변수

nSchema
개체의 스키마를 지정합니다.

설명

다음 호출은 GetObjectSchema 에 저장된 nSchema값을 반환합니다.

고급 버전 관리(예: 파생 클래스의 함수에서 특정 버전을 강제로 읽으려는 경우)에 Serialize 사용합니다SetObjectSchema.

예시

ar.SetObjectSchema(2);
ASSERT(2 == ar.GetObjectSchema());

CArchive::SetStoreParams

많은 수의 CObject파생 개체를 보관에 저장할 때 사용합니다SetStoreParams.

void SetStoreParams(UINT nHashSize = 2053, UINT nBlockSize = 128);

매개 변수

nHashSize
인터페이스 포인터 맵에 대한 해시 테이블의 크기입니다. 소수여야 합니다.

nBlockSize
매개 변수를 확장하기 위한 메모리 할당 세분성을 지정합니다. 최상의 성능을 위해 2의 힘이어야 합니다.

설명

SetStoreParams 를 사용하면 serialization 프로세스 중에 고유한 개체를 식별하는 데 사용되는 맵의 해시 테이블 크기와 블록 크기를 설정할 수 있습니다.

개체가 저장되거나 호출된 후 MapObject WriteObject 호출해서는 SetStoreParams 안 됩니다.

예시

class CMyLargeDocument : public CDocument
{
public:
   virtual void Serialize(CArchive &ar);
};
void CMyLargeDocument::Serialize(CArchive &ar)
{
   if (ar.IsStoring())
      ar.SetStoreParams(); // use large defaults
   else
      ar.SetLoadParams();

   if (ar.IsStoring())
   {
      // code for storing CMyLargeDocument
   }
   else
   {
      // code for loading CMyLargeDocument
   }
}

CArchive::Write

지정된 바이트 수를 보관 파일에 씁니다.

void Write(const void* lpBuf, INT nMax);

매개 변수

lpBuf
보관 파일에 쓸 데이터를 포함하는 사용자 제공 버퍼에 대한 포인터입니다.

nMax
보관 파일에 쓸 바이트 수를 지정하는 정수입니다.

설명

보관 파일은 바이트 형식을 지정하지 않습니다.

함수 내 SerializeWrite 멤버 함수를 사용하여 개체에 포함된 일반 구조를 작성할 수 있습니다.

예시

char pbWrite[100];
memset(pbWrite, 'a', 100);
ar.Write(pbWrite, 100);

CArchive::WriteClass

파생 클래스를 serialization하는 동안 기본 클래스의 버전 및 클래스 정보를 저장하는 데 사용합니다 WriteClass .

void WriteClass(const CRuntimeClass* pClassRef);

매개 변수

pClassRef
요청된 클래스 참조에 CRuntimeClass 해당하는 구조체에 대한 포인터입니다.

설명

WriteClass는 기본 클래스CArchiveCRuntimeClass 대한 참조를 씁니다. 참조를 검색하는 데 사용합니다 CArchive::ReadClass .

WriteClass 는 보관된 클래스 정보가 런타임 클래스와 호환되는지 확인합니다. 호환 WriteClass CArchiveException되지 않는 경우 .

런타임 클래스는 사용해야 DECLARE_SERIAL 하며, IMPLEMENT_SERIAL그렇지 않으면 WriteClass .를 CNotSupportedExceptionthrow합니다.

클래스 참조의 WriteClass읽기 및 쓰기를 모두 처리하는 대신 사용할 SerializeClass 수 있습니다.

예시

CFile myFile(_T("My__test__file.dat"),
             CFile::modeCreate | CFile::modeReadWrite);

// Create a storing archive.
CArchive arStore(&myFile, CArchive::store);

// Store the class CAge in the archive.
arStore.WriteClass(RUNTIME_CLASS(CAge));

// Close the storing archive.
arStore.Close();

// Create a loading archive.
myFile.SeekToBegin();
CArchive arLoad(&myFile, CArchive::load);

// Load a class from the archive.
CRuntimeClass *pClass = arLoad.ReadClass();
if (!pClass->IsDerivedFrom(RUNTIME_CLASS(CAge)))
{
   arLoad.Abort();
}

CArchive::WriteObject

지정된 CObject 파일을 보관에 저장합니다.

void WriteObject(const CObject* pOb);

매개 변수

pOb
저장되는 개체에 대한 상수 포인터입니다.

설명

이 함수는 일반적으로 에 대해 오버로드된 insertion(<<) 연산자에 의해 CArchive 호출됩니다CObject. WriteObject는 차례로 보관된 클래스의 함수를 호출 Serialize 합니다.

보관을 IMPLEMENT_SERIAL 사용하려면 매크로를 사용해야 합니다. WriteObject 는 ASCII 클래스 이름을 보관 파일에 씁니다. 이 클래스 이름은 나중에 로드 프로세스 중에 유효성을 검사합니다. 특수 인코딩 체계는 클래스의 여러 개체에 대해 클래스 이름의 불필요한 중복을 방지합니다. 또한 이 체계는 둘 이상의 포인터를 대상으로 하는 개체의 중복 스토리지를 방지합니다.

정확한 개체 인코딩 메서드(ASCII 클래스 이름 포함)는 구현 세부 정보이며 이후 버전의 라이브러리에서 변경될 수 있습니다.

참고

보관을 시작하기 전에 모든 개체 만들기, 삭제 및 업데이트를 완료합니다. 보관을 개체 수정과 혼합하면 보관이 손상됩니다.

예시

클래스 CAge의 정의는 예제를 CObList::CObList참조하세요.

CFile myFile(_T("My__test__file.dat"),
             CFile::modeCreate | CFile::modeReadWrite);
CAge age(21), *pAge;

// Create a storing archive.
CArchive arStore(&myFile, CArchive::store);

// Write the object to the archive
arStore.WriteObject(&age);

// Close the storing archive
arStore.Close();

// Create a loading archive.
myFile.SeekToBegin();
CArchive arLoad(&myFile, CArchive::load);

// Verify the object is in the archive.
pAge = (CAge *)arLoad.ReadObject(RUNTIME_CLASS(CAge));
ASSERT(age == *pAge);

CArchive::WriteString

이 멤버 함수를 사용하여 버퍼에서 개체와 CArchive 연결된 파일에 데이터를 씁니다.

void WriteString(LPCTSTR lpsz);

매개 변수

lpsz
null로 끝나는 텍스트 문자열을 포함하는 버퍼에 대한 포인터를 지정합니다.

설명

종료 null 문자('\0')는 파일에 기록되지 않습니다. 줄 새로 고리도 자동으로 작성되지 않습니다.

WriteString 는 디스크 전체 조건을 포함하여 여러 조건에 대한 응답으로 예외를 throw합니다.

Write 은 사용할 수 있지만 null 문자에서 종료하는 대신 요청된 바이트 수를 파일에 씁니다.

예시

CFile myFile(_T("My__test__file.dat"),
             CFile::modeCreate | CFile::modeReadWrite);
CString str1("String1"), str2("String2"), str;

// Create a storing archive.
CArchive arStore(&myFile, CArchive::store);

// Write str1 and str2 to the archive
arStore.WriteString(str1);
arStore.WriteString(_T("\n"));
arStore.WriteString(str2);
arStore.WriteString(_T("\n"));

// Close the storing archive
arStore.Close();

// Create a loading archive.
myFile.SeekToBegin();
CArchive arLoad(&myFile, CArchive::load);

// Verify the two strings are in the archive.
arLoad.ReadString(str);
ASSERT(str == str1);
arLoad.ReadString(str);
ASSERT(str == str2);

참고 항목

계층 구조 차트
CFile 클래스
CObject 클래스
CSocket 클래스
CSocketFile 클래스