Использование CArchive <<
и >>
операторов
CArchive
предоставляет << и >> операторы для записи и чтения простых типов данных, а также CObject
для файлов и из нее.
Хранение объекта в файле с помощью архива
В следующем примере показано, как сохранить объект в файле с помощью архива:
CArchive ar(&theFile, CArchive::store); WORD wEmployeeID = 78; ar << wEmployeeID;
Загрузка объекта из значения, ранее хранящегося в файле
В следующем примере показано, как загрузить объект из значения, ранее хранящегося в файле:
CArchive ar(&theFile, CArchive::load); WORD wEmployeeID; ar >> wEmployeeID;
Обычно вы храните и загружаете данные в файл с помощью архива в Serialize
функциях производных CObject
классов, которые должны быть объявлены с помощью макроса DECLARE_SERIALIZE. Ссылка на CArchive
объект передается в функцию Serialize
. Вы вызываете IsLoading
функцию CArchive
объекта, чтобы определить, была ли Serialize
вызвана функция для загрузки данных из файла или хранения данных в файл.
Функция Serialize
производного от сериализуемого CObject
класса обычно имеет следующую форму:
void CSerializableObj::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())
{
// TODO: add storing code here
}
else
{
// TODO: add storing code here
}
}
Приведенный выше шаблон кода точно совпадает с тем, что приложение AppWizard создает для Serialize
функции документа (класс, производный от CDocument
). Этот шаблон кода помогает писать код, который проще просматривать, так как хранимый код и код загрузки всегда должны быть параллельными, как показано в следующем примере:
void CEmployee::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_strName << m_wAge;
else
archive >> m_strName >> m_wAge;
}
Библиотека определяет и >>
операторы <<
для CArchive
первого операнда и следующих типов данных и классов в качестве второго операнда:
BYTE
CObject*
COleCurrency
COleDateTime
COleDateTimeSpan
COleVariant
CString
CTime
и CTimeSpan
Double
DWORD
Float
Int
LONG
POINT
и CPoint
RECT
и CRect
SIZE
и CSize
WORD
Примечание.
Для хранения и загрузки CObject
с помощью архива требуется дополнительное внимание. Дополнительные сведения см. в разделе "Хранение и загрузка CObjects" с помощью архива.
Операторы CArchive
<<
>>
всегда возвращают ссылку на CArchive
объект, который является первым операндом. Это позволяет цепочки операторов, как показано ниже:
archive << m_strName << m_wAge;