Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Сохранение сложного объекта


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

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

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

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

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

Код


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

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

Код


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


как быть?

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

Автор: tonchitos 11.7.2008, 13:50
честно говоря не оч поняла...


вот у мя объект 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 сложный объект, его ж так не сериализуешь...

или чет не то?

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

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

class model 
{

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

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

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

Автор: voov 11.7.2008, 16:21
Как я понял у 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. В принципе если очень нужно, то контроль версий и все остальное тоже можно сделать руками, но придется повозиться. Так что думай надо оно тебе или достаточно простого сохранения данных.

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

Автор: voov 11.7.2008, 17:04
А ты их не меняй. Сохраняй их все в методе Serialize класса myModel.

Автор: tonchitos 11.7.2008, 17:33
как? если операторы >> << ток для простых типов

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

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

Автор: tonchitos 11.7.2008, 18:01

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



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

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

Автор: voov 11.7.2008, 18:07
думаю проще показать на примере. приведи пример класса, который нужно сохранить (только небольшой)

Автор: tonchitos 11.7.2008, 18:16
ну что там приводить то?

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

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

Автор: tonchitos 14.7.2008, 15:30
ну так как мне его сохранять то?

Автор: Setter 14.7.2008, 21:21
Там у CArchive есть функции WriteClass и ReadClass.
Почему нельзя организовать например таким образом:
Код

CFile file;
file.Open(L"\\1.ert", CFile::modeCreate|CFile::modeWrite);
CArchive ar(&file, CArchive::store);
ar.WriteClass(RUNTIME_CLASS(CMyClass);
ar.Close();
file.Close();


И соответственно потом считать:
Код

CFile file;
file.Open(L"\\1.ert",CFile::modeRead);
CArchive ar(&file, CArchive::load);
CMyClass* pClass = ar.ReadClass();
ar.Close();
file.Close();

Автор: Rapalex 15.7.2008, 16:07
> ну так как мне его сохранять то?
никак!!!

Автор: tonchitos 15.7.2008, 16:13
Цитата(Rapalex @  15.7.2008,  16:07 Найти цитируемый пост)
никак!!!

так не бывает... и потом, ты же мне сам про буст сериализацию говорил

Автор: Rapalex 15.7.2008, 16:31
Она подразумевает что ты создаёшь сохраняемый объект!!!

Автор: Ln78 15.7.2008, 17:43
Цитата(voov @  11.7.2008,  19:07 Найти цитируемый пост)
думаю проще показать на примере. приведи пример класса, который нужно сохранить (только небольшой) 

tonchitos, я солидаризируюсь с voov: если хочешь получить ответ, чётче сформулируй вопрос, напиши маленький демопроект, в котором была бы суть проблемы. А так мне тоже непонятно, что у тебя есть и что ты хочешь. Вероятно, в библиотеках содержатся реализации некоторых классов, составляющих модели. И здесь можно только догадываться, о таких вопросах, как: каким образом составляющие объекты включаются в суммарный, что суммарному известно о составляющих (h-файлы с классами; интерфейсы на самодельные классы, их реализующие; модель COM), кто и каким образом меняет параметры классов (одно дело, внутри класса есть некий GUI, который, возможно, внутри же и вызывается, другое - есть функции get/set, доступные из внешнего модуля). И ещё: те классы и библиотеки нельзя менять принципиально, или просто не хотелось бы?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)