Проблема десериализации класса в DLL
Всем привет,
У меня есть проблема с десериализацией файла, созданного с помощью программы VS2010 C++, используя более развитую версию VS2015 той же программы.
Некоторые классы были перемещены в библиотеки DLL, и я соответствующим образом изменил макросы DECLARE_SERIAL и IMPLEMENT_SERIAL. Почти все старые загрузки файлов на отлично, занятия десериализации переехали в ДЛЛ без проблем.
Структура программы, по сути, такова: каждый класс передает десериализацию своему базовому классу:
DLL содержит:
CBaseDLL : public CObject {...}; CDerivedDLL1 : public CBaseDLL {...}; CDerivedDLL2 : public CDerivedDLL1 {...};
EXE содержит:
CDerivedExe1 : public CBaseDLL { ....; CDerivedDLL2 *m_d2; void Serialize(CArchive &ar) { CBaseDLL::Serialize(ar); ar >> ....; ar >> m_d2; } } CDerivedExe2 : public CDerivedExe1 { ....; void Serialize(CArchive &ar) { CDerivedExe1::Serialize(ar); ar >> ....; } } CDocExe::Serialize() { for (int i=0; i<3; ++i) { CDerivedExe2 *de2; ar >> de2; } }
Самое странное, что в файле есть три объекта CDerivedExe. Первый загружается правильно. Второй проваливается.
Что я уже пробовал:
Я шагнул прямо в код загрузки MFC, и проблема заключается в CArchive:: ReadClass () (строка 493 arcobj.cpp), где m_pLoadArray возвращает, что класс, который он пытается загрузить, имеет тип CDerivedDLL2 вместо CDerivedExe2. Я предполагаю, что где-то десериализация путается в том, ищет ли она DLL-класс или EXE-класс, но я не могу понять, почему она работает один раз, а затем терпит неудачу.
Любые предложения с благодарностью принимаются!
hairy_hats
Тайна углубляется. Я переместил классы обратно в EXE-файл, и проблема сохраняется: первый объект, подлежащий десериализации, в порядке, но второй неправильно интерпретируется кодом поиска схемы.