Сериализация указателя с помощью MFC CArchive (с mfc100d.dll, CMemFile) - PullRequest
1 голос
/ 16 марта 2011

Я сталкиваюсь с проблемой сериализации и десериализации данных указателя в VS2010 VC ++.По сути, программе не удалось сериализовать и десериализовать данные указателя CObList *.Исходный код выполняет обычные шаги для обработки процесса:

1) MyObject был унаследован от CObject;

2) Мы добавили DECLARE_SERIAL (MyObject) в объявлении класса (1-я строка);

3) Мы добавили IMPLEMENT_SERIAL (MyObject, MyParentObject, SCHEMA_VERSION)

//Where MyParentObject is inherited from CObject (indirectly, there're a few more levels of objects), SCHEMA_VERSION is just a version control CONSTANT we use

4) Затем мы перегружены

void MyObject::Serialize( CArchive& ar )
{
   BOOL b;
   .....
   ... (some other simple variables with default values)

   MyParentObject::Serialize(ar);

   if (ar.IsStoring())
   {
      ar << m_sTitle;
      ar << m_pObjectsList;
   }
   else
   {
      ar >> m_sTitle;
      ar >> m_pObjectsList;
   }
}

Примечание: MyParentObject :: Serialize реализован соответственно,CObList * m_pObjectsList;в заголовочном файле объявлен правильно.

Программа вызвала нарушение прав доступа (исключение первого шанса при 0x52e77b2c (mfc100d.dll) в MyApp.exe: 0xC0000005: местоположение чтения нарушения доступа 0x00000004) при попытке десериализации из"ar >> m_pObjectsList".

Затем я начал тестирование и изменил сложный указатель m_pObjectsList на простой указатель на CString.Такая же ошибка возникает в то же время при десериализации указателя на CString.Если я просто сериализовать и десериализовать с помощью CString (без указателя), он работает нормально.Кажется, что некоторая сериализация указателя нарушена.

Может быть, MFC100d не работает с программой W32 в отладчике 64-битной ОС?Это вызывает проблемы как в режиме отладки, так и в режиме выпуска.Что происходит?Я исчерпал свои ресурсы, и любое направление или вдохновение очень ценится.Спасибо всем впереди.

1 Ответ

4 голосов
/ 17 марта 2011

Указатели не могут быть сериализованы .

Нет никакой гарантии, что

  1. приложение, считывающее файл, будет иметь доступ к той же области памяти
  2. ОС поместит данные в то же место
  3. приложение, считывающее файл, будет помещено в то же место в памяти

Одна идея состоит в том, чтобы эмулировать указатели с помощью смещения файлов.Таким образом, объект находится в позиции в файле относительно начала.Это сложно.

Лучшая идея - записать все данных и позволить приложению, считывающему данные, поместить данные в память.Это также дает приложению свободу использовать любую структуру данных для хранения данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...