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
일반적으로 멤버 함수가 있으며 일반적으로 클래스CObject
에 DECLARE_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::Close
Abort
오류를 무시하므로 오류에 대한 예외를 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
수 있습니다.
개체에 저장하고 개체에서 로드할 때 호출 MapObject
할 CArchive
수 있습니다. 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
.
설명
그렇지 않은 NULL
ReadClass
경우 pClassRefRequested
보관된 클래스 정보가 런타임 클래스와 호환되는지 확인합니다. 호환 ReadClass
CArchiveException
되지 않는 경우 .
런타임 클래스는 사용해야 DECLARE_SERIAL
하며, IMPLEMENT_SERIAL
그렇지 않으면 ReadClass
.를 CNotSupportedException
throw합니다.
이 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
에 대한 참조를 개체에 읽거나 씁니다. 기본 클래스 개체 SerializeClass
를 ReadClass
WriteClass
직렬화하는 편리한 방법으로 대신 사용합니다SerializeClass
. 코드가 적고 매개 변수가 적습니다.
SerializeClass
마찬가지로 ReadClass
보관된 클래스 정보가 런타임 클래스와 호환되는지 확인합니다. 호환 SerializeClass
CArchiveException
되지 않는 경우 .
런타임 클래스는 사용해야 DECLARE_SERIAL
하며, IMPLEMENT_SERIAL
그렇지 않으면 SerializeClass
.를 CNotSupportedException
throw합니다.
매크로를 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
보관 파일에 쓸 바이트 수를 지정하는 정수입니다.
설명
보관 파일은 바이트 형식을 지정하지 않습니다.
함수 내 Serialize
의 Write
멤버 함수를 사용하여 개체에 포함된 일반 구조를 작성할 수 있습니다.
예시
char pbWrite[100];
memset(pbWrite, 'a', 100);
ar.Write(pbWrite, 100);
CArchive::WriteClass
파생 클래스를 serialization하는 동안 기본 클래스의 버전 및 클래스 정보를 저장하는 데 사용합니다 WriteClass
.
void WriteClass(const CRuntimeClass* pClassRef);
매개 변수
pClassRef
요청된 클래스 참조에 CRuntimeClass
해당하는 구조체에 대한 포인터입니다.
설명
WriteClass
는 기본 클래스CArchive
에 CRuntimeClass
대한 참조를 씁니다. 참조를 검색하는 데 사용합니다 CArchive::ReadClass
.
WriteClass
는 보관된 클래스 정보가 런타임 클래스와 호환되는지 확인합니다. 호환 WriteClass
CArchiveException
되지 않는 경우 .
런타임 클래스는 사용해야 DECLARE_SERIAL
하며, IMPLEMENT_SERIAL
그렇지 않으면 WriteClass
.를 CNotSupportedException
throw합니다.
클래스 참조의 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);