Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сохранение сложного объекта 
:(
    Опции темы
tonchitos
Дата 10.7.2008, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 24.2.2007

Репутация: 1
Всего: 40



1) Есть у меня некая пользовательская библиотечка (проект подключается в солюшн), не использующая мфс.
2) и есть энное количество классов (тож почти библиотека), описанных в файле проекта, использующие ту библиотечку и тоже не использующие мфс

и есть мой мфс проект...

мне надо сохранить некий объект класса, который содержит кучу объектов классов из пп 1 и 2

соответственно наследовать все от собджект нет никакой возможности...

есть ли возможность сохранения довольно сложного объекта ( не меняя класс его описывающий)...
Позволит ли мне это реализовать буст сериализация?

Код


class CreadMDLDoc : public CDocument
{
................................................

    Model m_pModel; // вот объект

Код


class Model : public Definition
{...................
// большущий пребольшущий класс который низя портить


как быть?


--------------------
– Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил.
PM MAIL   Вверх
Earnest
Дата 11.7.2008, 08:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Ну в чем трабл? Напиши метод CMyClass::Serialize (CArchive&) и вызывай его в нужном месте. Не будет только динамического оздания - т.е. тебе нужно при загрузке самой создать объект и загрузить его. Да и динамическое создание можно без Object'ов сделать, если приспичит... мало ли способово реализовать фабрику объектов...



--------------------
...
PM   Вверх
tonchitos
Дата 11.7.2008, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 24.2.2007

Репутация: 1
Всего: 40



честно говоря не оч поняла...


вот у мя объект model myModel;

я делаю так?:
Код


class myCl : public cObject
{

.........

 model * myModel;
................
//////

}

void myCl::Serialize(CArchive& ar)
{
     CObject::Serialize(ar);
    if (ar.IsStoring())
       ar << myModel;
    else
       ar >> myModel; 

}


но ведь myModel сложный объект, его ж так не сериализуешь...

или чет не то?


Это сообщение отредактировал(а) tonchitos - 11.7.2008, 13:50


--------------------
– Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил.
PM MAIL   Вверх
Earnest
Дата 11.7.2008, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Что значит "не сериализуешь"? Само, конечно, не сериализуется. Так напиши для него сериализацию!
model::Serialize (CArchive& ar), и дальше по частям через Write\Read или Serizlize отдельных кусков
И на кой тебе CObject::Serialize(ar);? Ты что, не знаешь, что в буфере лежит?
Делать это имеет смысл только если у тебя в файле могут быть в произвольном порядке объекты разных типов. А если все жестко и заранее известно, то только место тратить ( в файле и в коде).


--------------------
...
PM   Вверх
tonchitos
Дата 11.7.2008, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 24.2.2007

Репутация: 1
Всего: 40



так проблема в том что класс model я менять не могу. это раз
класс модел содержит очень много объектов классов, которые я тоже менять не могу

class model 
{

 class1 myCl1;
 class2 myCl2;
 classn myCl3;
......................
};
class classn
{
 classn1 myCln1;
 classn2 myCln2;
 classnm myClnm

}
я не могу вписать в класс модел сериализацию, плюс он не от cobjectа, плюс тем более яне могу трогать объеекты которые он содержит, тк это считай библиотека целая, я ж не могу ее всю переписать и для каждого класса написать сериализацию и все от собджекта наследовать....

у меня есть объект класса, и от этого надо плясать, максиммум я могу отнаследовать все от класса model но не трогая код описывающий класс и его содержимое...


--------------------
– Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил.
PM MAIL   Вверх
voov
Дата 11.7.2008, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Патамушта мы пилоты
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 29.11.2007

Репутация: 8
Всего: 8



Как я понял у myModel нет предка CObject.
Тогда так не прокатит
Код

    if (ar.IsStoring())
       ar << myModel;
    else
       ar >> myModel; 

Сделай в классе myModel метод Serialize или может даже лучше MySerialize. В нем сделай сохранение/загрузку переменных-членов класса подобно коду выше. Если здесь возникнут вопросы - помогу. Потом делаешь так
Код

void myCl::Serialize(CArchive& ar)
{
     CObject::Serialize(ar);

    if (ar.IsStoring()) {
       ar << ...;
       myModel->Serialize(ar);
    }
    else {
       ar >> ....; 
       myModel = new model();
       myModel->Serialize(ar);
    }
}

Но это будет не МФС-ная сериализация, а просто сохранение/загрузка данных без контроля версий и графа объектов, о которых говорил Rapalex. В принципе если очень нужно, то контроль версий и все остальное тоже можно сделать руками, но придется повозиться. Так что думай надо оно тебе или достаточно простого сохранения данных.
PM MAIL   Вверх
tonchitos
Дата 11.7.2008, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 24.2.2007

Репутация: 1
Всего: 40



ну е мое...myModel же тоже содержит кучу объектов не наследованных от собжекта...все их менять нереально, это все равно что библиотеку переписать...  smile 


--------------------
– Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил.
PM MAIL   Вверх
voov
Дата 11.7.2008, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Патамушта мы пилоты
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 29.11.2007

Репутация: 8
Всего: 8



А ты их не меняй. Сохраняй их все в методе Serialize класса myModel.
PM MAIL   Вверх
tonchitos
Дата 11.7.2008, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 24.2.2007

Репутация: 1
Всего: 40



как? если операторы >> << ток для простых типов


--------------------
– Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил.
PM MAIL   Вверх
Earnest
Дата 11.7.2008, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Во-первых, такие операторы можно написать для любых типов (вот скажем Cstring - это ведь не CObject), а во вторых есть еще Read\Write


--------------------
...
PM   Вверх
voov
Дата 11.7.2008, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Патамушта мы пилоты
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 29.11.2007

Репутация: 8
Всего: 8



Да. Нужно добираться до простых типов в твоем объекте и сохранять их. Главное не перепутать последовательность при сохранении и загрузке. Да метод будет большой, но рабочий. Поддерживать изменения тоже будет не просто, но как я понял класс уже готов и меняться не должен.
PM MAIL   Вверх
tonchitos
Дата 11.7.2008, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 24.2.2007

Репутация: 1
Всего: 40




Цитата(voov @  11.7.2008,  17:42 Найти цитируемый пост)
Да. Нужно добираться до простых типов в твоем объекте и сохранять их. Главное не перепутать последовательность при сохранении и загрузке. Да метод будет большой, но рабочий. Поддерживать изменения тоже будет не просто, но как я понял класс уже готов и меняться не должен. 



как я до них доберусь если это практически библиотека хоть и небольшая и менять ничего нельзя...

но даже если я напишу для них операторы, ведь я так понимаю что при классе с объектами классов любой сложности вложенности необходимо чтобы для каждого сохраняемого объекта был сериалайз и чтобы они все от собджекта были... я не втыкаю... че мне делоть та?


--------------------
– Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил.
PM MAIL   Вверх
voov
Дата 11.7.2008, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Патамушта мы пилоты
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 29.11.2007

Репутация: 8
Всего: 8



думаю проще показать на примере. приведи пример класса, который нужно сохранить (только небольшой)
PM MAIL   Вверх
tonchitos
Дата 11.7.2008, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 24.2.2007

Репутация: 1
Всего: 40



ну что там приводить то?

смысл? 
есть класс, который содержит объекты других классов.
код с описанием этого класса и прочих менять нельзя...
они не наследованы от cobject не имеют сериализации и впихнуть ее туда нельзя....

есть только конечный класс, вот от него пожалуйста - можно наследовать и тп


--------------------
– Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил.
PM MAIL   Вверх
tonchitos
Дата 14.7.2008, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 24.2.2007

Репутация: 1
Всего: 40



ну так как мне его сохранять то?


--------------------
– Люди забыли эту истину, – сказал Лис, – но ты не забывай: ты навсегда в ответе за всех, кого приручил.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.1331 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.