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

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

AlexSaaa

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

создал клас 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

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

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

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


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

AlexSaaa

Гость
#3
Код:
[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

Гость
#5
что значит

"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

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

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

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

AlexSaaa

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

artiom_kh

Гость
#9
Во первых, дело в том что 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;
}
 
Статус
Закрыто для дальнейших ответов.