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

Тема в разделе "MS Visual C++", создана пользователем AlexSaaa, 10 май 2006.

Статус темы:
Закрыта.
  1. AlexSaaa

    AlexSaaa Гость

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

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

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

    COleDateTime m_tmDate;//собственно объект который пытаюсь сеарилизировать
    };
    вопрос в том смогу ли я сеаризировать COleDateTime объект?
    т вообще какие классы подлежат сеарилизации..а какие нет?
     
  2. artiom_kh

    artiom_kh Гость

    Сможешь:

    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);
     
  3. AlexSaaa

    AlexSaaa Гость

    Код (Text):
    [quote]ar>>(int)m_tmDate.m_status;[/quote]
    компилятор ругает, аки
    а просто

    ar<<m_tmDate;
    ar>>m_tmDate;

    не покатит?
     
  4. artiom_kh

    artiom_kh Гость

    Сорри, попробуй
    ar>>(int&)m_tmDate.m_status;

    не покатит, колёса потому что квадратные :))
     
  5. AlexSaaa

    AlexSaaa Гость

    что значит

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

    где-то тут

    Код (Text):
        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();
     
  6. artiom_kh

    artiom_kh Гость

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

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

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

    AlexSaaa Гость

    хорошо как с сим бороться?
     
  8. AlexSaaa

    AlexSaaa Гость

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

    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;
    }
     
Загрузка...
Похожие Темы - Сериализация
  1. VladSh
    Ответов:
    7
    Просмотров:
    2.392
Статус темы:
Закрыта.

Поделиться этой страницей