Класс CArchive
Позволяет сохранять сложную сеть объектов в постоянной двоичной форме (обычно дисковое хранилище), которая сохраняется после удаления этих объектов.
Синтаксис
class CArchive
Участники
Открытые конструкторы
Имя | Описание |
---|---|
CArchive::CArchive |
Создает объект CArchive . |
Открытые методы
Имя | Описание |
---|---|
CArchive::Abort |
Закрывает архив без исключения. |
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 |
Задает размер хэш-таблицы и размер блока карты, используемой для идентификации уникальных объектов во время процесса сериализации. |
CArchive::Write |
Записывает необработанные байты. |
CArchive::WriteClass |
Записывает ссылку на CRuntimeClass объект CArchive . |
CArchive::WriteObject |
Вызывает функцию объекта Serialize для хранения. |
CArchive::WriteString |
Записывает одну строку текста. |
Открытые операторы
Имя | Описание |
---|---|
CArchive::operator << |
Хранит объекты и примитивные типы в архив. |
CArchive::operator >> |
Загружает объекты и примитивные типы из архива. |
Открытые члены данных
Имя | Описание |
---|---|
CArchive::m_pDocument |
Примечания
CArchive
не имеет базового класса.
Позже вы можете загрузить объекты из постоянного хранилища, повторно создав их в памяти. Этот процесс создания постоянных данных называется сериализации.
Архивный объект можно рассматривать как двоичный поток. Как и входной или выходной поток, архив связан с файлом и разрешает буферизованное запись и чтение данных в хранилище и из нее. Поток ввода и вывода обрабатывает последовательности символов ASCII, но архив обрабатывает данные двоичного объекта в эффективном нередундантном формате.
Перед созданием объекта необходимо создать CFile
CArchive
объект. Кроме того, необходимо убедиться, что состояние загрузки и хранения архива совместимо с открытым режимом файла. Для каждого файла требуется только один активный архив.
При создании CArchive
объекта вы присоединяете его к объекту класса CFile
(или производного класса), представляющего открытый файл. Вы также указываете, будет ли архив использоваться для загрузки или хранения. CArchive
Объект может обрабатывать не только примитивные типы, но и объекты производных классов, предназначенных CObject
для сериализации. Сериализуемый класс обычно имеет Serialize
функцию-член, и обычно использует DECLARE_SERIAL
макросы и IMPLEMENT_SERIAL
макросы, как описано в классе CObject
.
Перегруженные операторы извлечения ( >>
) и вставки ( <<
) являются удобными интерфейсами программирования архива, поддерживающими как примитивные типы, так и CObject
производные классы.
CArchive
также поддерживает программирование с помощью классов CSocket
сокетов Windows MFC и CSocketFile
. Функция-член IsBufferEmpty
поддерживает это использование.
Дополнительные сведения CArchive
см. в статьях сериализация и сокеты Windows: использование сокетов с архивами.
Иерархия наследования
CArchive
Требования
Заголовок: afx.h
CArchive::Abort
Вызовите эту функцию, чтобы закрыть архив без исключения.
void Abort ();
Замечания
CArchive
Деструктор обычно вызываетClose
, что приведет к очистке любых данных, которые не были сохранены в связанном CFile
объекте. Это может привести к исключениям.
При перехвате этих исключений рекомендуется использовать Abort
, чтобы деструкция CArchive
объекта не приводила к дальнейшим исключениям. При обработке исключений не будет возникать исключение при сбоях, CArchive::Abort
так как, в отличие CArchive::Close
от ошибок, Abort
игнорируется.
Если вы использовали new
для выделения CArchive
объекта в куче, его необходимо удалить после закрытия файла.
Пример
Пример см. в примере 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
Целое число, указывающее размер внутреннего буфера файла в байтах. Обратите внимание, что размер буфера по умолчанию составляет 4096 байт. Если вы обычно архивируйте большие объекты, вы улучшите производительность при использовании большего размера буфера, который является нескольким размером буфера файла.
lpBuf
Необязательный указатель на предоставленный пользователем буфер размера nBufSize
. Если этот параметр не указан, архив выделяет буфер из локальной кучи и освобождает его при уничтожении объекта. Архив не освобождает предоставленный пользователем буфер.
Замечания
Эту спецификацию нельзя изменить после создания архива.
Вы не можете использовать CFile
операции для изменения состояния файла, пока вы не закрыли архив. Любая такая операция повредит целостность архива. Вы можете получить доступ к позиции указателя файла в любое время во время сериализации, получив объект файла архива из GetFile
функции-члена, а затем используя функцию CFile::GetPosition
. Перед получением позиции указателя файла необходимо вызвать 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;
Возвращаемое значение
Константный указатель на используемый CFile
объект.
Замечания
Перед использованием GetFile
необходимо очистить архив.
Пример
const CFile *fp = ar.GetFile();
CArchive::GetObjectSchema
Вызовите эту функцию из Serialize
функции, чтобы определить версию объекта, который в настоящее время десериализирован.
UINT GetObjectSchema();
Возвращаемое значение
Во время десериализации версия объекта, считываемого.
Замечания
Вызов этой функции действителен только при CArchive
загрузке объекта ( CArchive::IsLoading
возвращает ненулевое значение). Это должен быть первый вызов функции Serialize
и вызываться только один раз. Возвращаемое значение (UINT)-1 указывает, что номер версии неизвестен.
Производный CObject
класс может использовать VERSIONABLE_SCHEMA
объединенный (с побитовой "или" (|
)) с самой версией схемы (в IMPLEMENT_SERIAL
макросе) для создания "объект, доступный для версий", то есть объект, функция-член которого Serialize
может считывать несколько версий. Функциональные возможности платформы по умолчанию (без VERSIONABLE_SCHEMA
) создают исключение при несоответствии версии.
Пример
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;
Возвращаемое значение
Ненулевое значение, если буфер архива пуст; в противном случае — 0.
Замечания
Эта функция предоставляется для поддержки программирования с помощью класса CSocketFile
сокетов Windows MFC. Его не нужно использовать для архива, связанного CFile
с объектом.
Причина использования IsBufferEmpty
архива, связанного с CSocketFile
объектом, заключается в том, что буфер архива может содержать несколько сообщений или записей. После получения одного сообщения следует использовать IsBufferEmpty
для управления циклом, который продолжает получать данные, пока буфер не пуст. Дополнительные сведения см. в Receive
функции-члене класса CAsyncSocket
, в которой показано, как использовать IsBufferEmpty
.
Дополнительные сведения см. в статье "Сокеты Windows: использование сокетов с архивами".
CArchive::IsLoading
Определяет, загружается ли архив данных.
BOOL IsLoading() const;
Возвращаемое значение
Ненулевое значение, если архив в настоящее время используется для загрузки; в противном случае — 0.
Замечания
Эта функция-член вызывается Serialize
функциями архивированных классов.
Пример
int i = 0;
if (ar.IsLoading())
ar >> i;
else
ar << i;
CArchive::IsStoring
Определяет, хранится ли архив данных.
BOOL IsStoring() const;
Возвращаемое значение
Ненулевое значение, если архив в настоящее время используется для хранения; в противном случае — 0.
Замечания
Эта функция-член вызывается Serialize
функциями архивированных классов.
IsStoring
Если состояние архива ненулевое, его 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
объектом во время сериализации и десериализации, но в отличие ReadObject
WriteObject
от этого, он не вызывает сериализацию объекта.
Пример
//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;
Замечания
Обычное использование этого указателя заключается в передаче дополнительных сведений о процессе сериализации для всех объектов, сериализованных. Это достигается путем инициализации указателя с документом CDocument
(производным классом), который сериализуется, таким образом, чтобы объекты в документе могли получить доступ к документу при необходимости. Этот указатель также используется объектами COleClientItem
во время сериализации.
Платформа задает 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);
Возвращаемое значение
Ссылка CArchive
, которая включает несколько операторов вставки в одной строке.
Замечания
Последние две версии выше предназначены специально для хранения 64-разрядных целых чисел.
Если макрос использовался IMPLEMENT_SERIAL
в реализации класса, то оператор вставки перегружен для CObject
вызовов защищенных WriteObject
. Эта функция, в свою очередь, вызывает Serialize
функцию класса.
Оператор CStringT
вставки (<<
) поддерживает дамп диагностики и хранение в архиве.
Примеры
В этом примере демонстрируется использование CArchive
оператора <<
вставки с int
типами и типами long
.
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);
Возвращаемое значение
Ссылка CArchive
, которая включает несколько операторов извлечения в одной строке.
Замечания
Последние две версии выше предназначены для загрузки 64-разрядных целых чисел.
Если в реализации класса использовался IMPLEMENT_SERIAL
макрос, операторы извлечения перегружены для 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
Целое число без знака, указывающее число байтов для чтения из архива.
Возвращаемое значение
Целое число без знака, содержащее количество байтов, которые фактически считываются. Если возвращаемое значение меньше запрошенного числа, достигнуто окончание файла. Исключение не возникает в условии окончания файла.
Замечания
Архив не интерпретирует байты.
Функцию-член Read
в Serialize
функции можно использовать для чтения обычных структур, содержащихся в объектах.
Пример
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
.
Возвращаемое значение
Указатель на структуру CRuntimeClass
.
Замечания
Если pClassRefRequested
это не NULL
так, ReadClass
проверяет, совместим ли архивная информация о классе среды выполнения. Если оно несовместимо, ReadClass
вызовет CArchiveException
исключение.
Класс среды выполнения должен использовать DECLARE_SERIAL
и IMPLEMENT_SERIAL
; в противном случае ReadClass
вызовет CNotSupportedException
исключение.
Если pSchema
это NULL
так, схема сохраненного класса может быть получена путем вызова CArchive::GetObjectSchema
; *pSchema
в противном случае будет содержать схему класса времени выполнения, который ранее хранился.
Вместо этого ReadClass
можно использоватьSerializeClass
, который обрабатывает как чтение, так и запись ссылки на класс.
Пример
Пример см. в примере CArchive::WriteClass
.
CArchive::ReadObject
Считывает данные объекта из архива и создает объект соответствующего типа.
CObject* ReadObject(const CRuntimeClass* pClass);
Параметры
pClass
Константный указатель на CRuntimeClass
структуру, соответствующую объекту, который требуется прочитать.
Возвращаемое значение
Указатель CObject
, который должен быть безопасно приведение к правильному производного класса с помощью CObject::IsKindOf
.
Замечания
Эта функция обычно вызывается оператором CArchive
извлечения ( >>
) перегруженным для CObject
указателя. ReadObject
в свою очередь вызывает Serialize
функцию архивированного класса.
Если вы предоставляете ненулевой 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
.
Возвращаемое значение
В версии, которая возвращает boOL, если выполнено успешно; TRUE
FALSE
в противном случае.
В версии, которая возвращает LPTSTR
указатель на буфер, содержащий текстовые данные; NULL
если достигнут конец файла.
Замечания
В версии функции-члена с nMax
параметром буфер будет содержать не более nMax
1 символов. Чтение останавливается парой канала возврата каретки. Конечные новые символы всегда удаляются. Символ NULL
('\0') добавляется в любом случае.
CArchive::Read
также доступен для ввода в текстовом режиме, но он не завершается парой канала возвращаемой строки каретки.
Пример
Пример см. в примере CArchive::WriteString
.
CArchive::SerializeClass
Вызовите эту функцию-член, когда вы хотите хранить и загружать сведения о версии базового класса.
void SerializeClass(const CRuntimeClass* pClassRef);
Параметры
pClassRef
Указатель на объект класса времени выполнения для базового класса.
Замечания
SerializeClass
считывает или записывает ссылку на класс в CArchive
объект в зависимости от направления CArchive
объекта. Используйте SerializeClass
вместо ReadClass
и WriteClass
как удобный способ сериализации объектов базового класса; SerializeClass
требует меньше кода и меньше параметров.
Например ReadClass
, SerializeClass
проверяет, совместим ли архивная информация о классе среды выполнения. Если оно несовместимо, SerializeClass
вызовет CArchiveException
исключение.
Класс среды выполнения должен использовать DECLARE_SERIAL
и IMPLEMENT_SERIAL
; в противном случае SerializeClass
вызовет CNotSupportedException
исключение.
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
Вызов при SetLoadParams
чтении большого количества производных CObject
объектов из архива.
void SetLoadParams(UINT nGrowBy = 1024);
Параметры
nGrowBy
Минимальное количество слотов элементов, выделяемых при необходимости увеличения размера.
Замечания
CArchive
использует массив нагрузки для разрешения ссылок на объекты, хранящиеся в архиве. SetLoadParams
позволяет задать размер, на который увеличивается массив нагрузки.
Не следует вызывать SetLoadParams
после загрузки любого объекта или после MapObject
вызова ReadObject
.
Пример
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
.
Используйте SetObjectSchema
для расширенного управления версиями, например, если требуется принудительно считывать определенную версию в Serialize
функции производного класса.
Пример
ar.SetObjectSchema(2);
ASSERT(2 == ar.GetObjectSchema());
CArchive::SetStoreParams
Используется SetStoreParams
при хранении большого количества производных CObject
объектов в архиве.
void SetStoreParams(UINT nHashSize = 2053, UINT nBlockSize = 128);
Параметры
nHashSize
Размер хэш-таблицы для карт указателя интерфейса. Должно быть простым числом.
nBlockSize
Указывает степень детализации выделения памяти для расширения параметров. Должен быть мощностью 2 для оптимальной производительности.
Замечания
SetStoreParams
позволяет задать размер хэш-таблицы и размер блока карты, используемой для идентификации уникальных объектов во время процесса сериализации.
Не следует вызывать SetStoreParams
после хранения объектов или после или WriteObject
после MapObject
вызова.
Пример
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
Целое число, указывающее число байтов, записываемых в архив.
Замечания
Архив не форматировать байты.
Функцию-член Write
в Serialize
функции можно использовать для записи обычных структур, содержащихся в объектах.
Пример
char pbWrite[100];
memset(pbWrite, 'a', 100);
ar.Write(pbWrite, 100);
CArchive::WriteClass
Используется WriteClass
для хранения сведений о версии и классе базового класса во время сериализации производного класса.
void WriteClass(const CRuntimeClass* pClassRef);
Параметры
pClassRef
Указатель на CRuntimeClass
структуру, соответствующую запрошенной ссылке класса.
Замечания
WriteClass
записывает ссылку на CRuntimeClass
базовый класс в .CArchive
Используется CArchive::ReadClass
для получения ссылки.
WriteClass
Проверяет, совместим ли архивная информация о классе среды выполнения. Если оно несовместимо, WriteClass
вызовет CArchiveException
исключение.
Класс среды выполнения должен использовать DECLARE_SERIAL
и IMPLEMENT_SERIAL
; в противном случае WriteClass
вызовет CNotSupportedException
исключение.
Вместо этого 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
Константный указатель на сохраненный объект.
Замечания
Обычно эта функция вызывается оператором 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
создает исключение в ответ на несколько условий, включая полное условие диска.
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
Класс