hairy_hats Ответов: 2

Проблема десериализации класса в 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-файл, и проблема сохраняется: первый объект, подлежащий десериализации, в порядке, но второй неправильно интерпретируется кодом поиска схемы.

2 Ответов

Рейтинг:
7

hairy_hats

Древний патч не позволял правильно построить карту классов в коде десериализации CArchive после перемещения классов в библиотеку DLL. Теперь все работает.


Рейтинг:
0

KarstenK

Вы должны переопределить оператор >>, Чтобы устранить эту проблему. Если шагать с отладчиком в оператор >> Вы должны это видеть.

IMHO: это не очень хорошая идея или четкий дизайн для перезаписи классов из dll.


hairy_hats

Пожалуйста, не могли бы вы объяснить далее, Почему мне нужно переопределить оператор >>, Когда первый объект загружается правильно с помощью оператора >>? Спасибо!

Кроме того, разве CodeProject не содержит много классов, производных от классов MFC в библиотеках DLL?!