Сериализа
От: EugenyAL  
Дата: 15.06.06 05:50
Оценка:
Здравствуйте!
Вопрос следующий
Есть иерарахия классов
class CBase:
{
public:
virtual bool Find(int value)=0;
virtual bool Serialize(BOOL bSave); // Для сериализаици внутренних данных (это не метод МFC)
protected:
// Здесь то
}

class CDerived1:public CBase
{
Здесь реализованны виртуальные методы Find и Serialize
.......
private:
// Здесь то чего нет у CBase и что тоже необходтмо сохранить
}

Есть список CAtlList<CBase*> который содержит указатели на производные от CBase

В один прекрасnный момент возниакает необходимость сохранять данные объектов в потоке (например в файле)
(пробегаемся по списку и вызываем Serialize). Здесь все нормально и никаких проблем не возникает.


Проблема воникает при восстановлении данных. Так как содержимое CAtlList сохранять смысла не имеет( указатель величина переменая), при перезапуске программы необходимо заного заполнять содержимое CAtlList.

При этом необходимо четко знать на какой именно производный от CBase класс храниться указатель , так как производный классы содержит какие-то свои данные которые необходимо корректно восстановить из потока.

Подскажите пожалуйста как решить данную проблему.
Заранее Спасибо.
Re: Сериализа
От: Smal Россия  
Дата: 15.06.06 08:16
Оценка:
Здравствуйте, EugenyAL, Вы писали:

EAL>Проблема воникает при восстановлении данных. Так как содержимое CAtlList сохранять смысла не имеет( указатель величина переменая), при перезапуске программы необходимо заного заполнять содержимое CAtlList.


EAL>При этом необходимо четко знать на какой именно производный от CBase класс храниться указатель , так как производный классы содержит какие-то свои данные которые необходимо корректно восстановить из потока.


EAL>Подскажите пожалуйста как решить данную проблему.


При сериализации в начале каждого класса ставь некоторый его идентификатор.
А при десериализации сделай switch по этому идентификатору.
С уважением, Александр
Re[2]: Сериализа
От: Longobard Россия http://longobard.org.ru
Дата: 15.06.06 09:12
Оценка:
S>При сериализации в начале каждого класса ставь некоторый его идентификатор.
S>А при десериализации сделай switch по этому идентификатору.

А еще лучше воспользоваться паттерном проектирования Factory, тогда не надо будет при добавлении нового класса править этот гигантский switch и не надо будет делать кучу лишних вещей. Почитайте Александреску "Современное проектирование на C++" (ISBN 5-8459-0571-0), там про это очень хорошо рассказано.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.