• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Сериализация...

  • Автор темы AlexSaaa
  • Дата начала
Статус
Закрыто для дальнейших ответов.
A

AlexSaaa

пытаюсь разобратся с сериалиазицией файлов...
возникло есколько вопросов..

создал клас MyClass:public CObject
декларировал и имплиментировал SERIAL
переопределил функцию Serialize
вобщем получилось что-то типа этого..

Код:
class MyClass : public CObject{
public:
MyClass();
virtual ~MyClass();
virtual void Serialize(CArchive& ar);

COleDateTime m_tmDate;//собственно объект который пытаюсь сеарилизировать
};

вопрос в том смогу ли я сеаризировать COleDateTime объект?
т вообще какие классы подлежат сеарилизации..а какие нет?
 
A

artiom_kh

вопрос в том смогу ли я сеаризировать COleDateTime объект?
Сможешь:

ar<<m_tmDate.m_dt;
ar<<(int)m_tmDate.m_status;

ar>>m_tmDate.m_dt;
ar>>(int)m_tmDate.m_status;


т вообще какие классы подлежат сеарилизации..а какие нет?
Немного не в тему, типы которые могут быть сериализованы (во блин сказал!) определяются в описании перегруженных функций CArchive::eek:perator << и CArchive::eek:perator >> и в различных версиях MFC они могут различаться, соответственно в твоём классе исходя из возможностей вышеуказанных функций должен быть реализован свой механизм сериализации через void Serialize(CArchive& ar);
 
A

AlexSaaa

Код:
[quote]ar>>(int)m_tmDate.m_status;[/quote]
компилятор ругает, аки
error C2679: binary '>>' : no operator found which takes a right-hand operand of type 'int' (or there is no acceptable conversion)

а просто

ar<<m_tmDate;
ar>>m_tmDate;

не покатит?
 
A

AlexSaaa

что значит

"An attempt was made to access an unnamed file past its end"

где-то тут

Код:
	CFile file;
if(!file.Open(_T("persons.dat"),CFile::modeRead)){
AfxMessageBox(_T("Unable to open the file"));
exit(-1);
}
CArchive arr(&file,CArchive::load);
m_obDebtors.Serialize(arr);
arr.Close();
file.Close();
 
A

artiom_kh

Это значит что Вы наступили на грабли - попытка обращения за конец неназванного файла, сия беда обычно возникает если читаешь данные из файла через CArchive, а данные в файле не валидны по размеру полей, т.е.

long myLong=1;
ar<<(int)myLong;//запишем как int

ar>>myLong;//прочтём как long и получим глюк в подарок :)
 
A

AlexSaaa

может быть это связано с тем что объявленна переменная типа COleDateTime m_tmDate
а считуется
m_tmDate.m_dt;
(int&)m_tmDate.m_status;
 
A

artiom_kh

Во первых, дело в том что m_tmDate.m_status имеет тип enum, а по правилам языка C/C++ enum следует приводить к int.
Во вторых, m_tmDate.m_status Вам в принципе не нужен, если вы уверены что ваша дата валидна, то достаточно записи/считывания m_tmDate.m_dt - в ней собственно и хранится информация о дате (целая часть - год/месяц/день, дробная - часы/минуты/секунды) и имеет она конечный тип double.

Вот нарыл в исходниках MFC:
CArchive& AFXAPI operator<<(CArchive& ar, COleDateTime dateSrc)
{
ar << (long)dateSrc.m_status;
return ar << dateSrc.m_dt;
}

CArchive& AFXAPI operator>>(CArchive& ar, COleDateTime& dateSrc)
{
ar >> (long&)dateSrc.m_status;
return ar >> dateSrc.m_dt;
}
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!