| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Visual C++/MFC/WTL > Сохранение сложного объекта |
| Автор: tonchitos 10.7.2008, 18:47 | ||||
| 1) Есть у меня некая пользовательская библиотечка (проект подключается в солюшн), не использующая мфс. 2) и есть энное количество классов (тож почти библиотека), описанных в файле проекта, использующие ту библиотечку и тоже не использующие мфс и есть мой мфс проект... мне надо сохранить некий объект класса, который содержит кучу объектов классов из пп 1 и 2 соответственно наследовать все от собджект нет никакой возможности... есть ли возможность сохранения довольно сложного объекта ( не меняя класс его описывающий)... Позволит ли мне это реализовать буст сериализация?
как быть? |
| Автор: Earnest 11.7.2008, 08:05 |
| Ну в чем трабл? Напиши метод CMyClass::Serialize (CArchive&) и вызывай его в нужном месте. Не будет только динамического оздания - т.е. тебе нужно при загрузке самой создать объект и загрузить его. Да и динамическое создание можно без Object'ов сделать, если приспичит... мало ли способово реализовать фабрику объектов... |
| Автор: tonchitos 11.7.2008, 13:50 | ||
| честно говоря не оч поняла... вот у мя объект model 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. Тогда так не прокатит
Сделай в классе myModel метод Serialize или может даже лучше MySerialize. В нем сделай сохранение/загрузку переменных-членов класса подобно коду выше. Если здесь возникнут вопросы - помогу. Потом делаешь так
Но это будет не МФС-ная сериализация, а просто сохранение/загрузка данных без контроля версий и графа объектов, о которых говорил Rapalex. В принципе если очень нужно, то контроль версий и все остальное тоже можно сделать руками, но придется повозиться. Так что думай надо оно тебе или достаточно простого сохранения данных. |
| Автор: tonchitos 11.7.2008, 16:24 |
| ну е мое...myModel же тоже содержит кучу объектов не наследованных от собжекта...все их менять нереально, это все равно что библиотеку переписать... |
| Автор: 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 |
| Да. Нужно добираться до простых типов в твоем объекте и сохранять их. Главное не перепутать последовательность при сохранении и загрузке. Да метод будет большой, но рабочий. Поддерживать изменения тоже будет не просто, но как я понял класс уже готов и меняться не должен. |
| Автор: 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. Почему нельзя организовать например таким образом:
И соответственно потом считать:
|
| Автор: Rapalex 15.7.2008, 16:07 |
| > ну так как мне его сохранять то? никак!!! |
| Автор: tonchitos 15.7.2008, 16:13 |
так не бывает... и потом, ты же мне сам про буст сериализацию говорил |
| Автор: Rapalex 15.7.2008, 16:31 |
| Она подразумевает что ты создаёшь сохраняемый объект!!! |
| Автор: Ln78 15.7.2008, 17:43 | ||
tonchitos, я солидаризируюсь с voov: если хочешь получить ответ, чётче сформулируй вопрос, напиши маленький демопроект, в котором была бы суть проблемы. А так мне тоже непонятно, что у тебя есть и что ты хочешь. Вероятно, в библиотеках содержатся реализации некоторых классов, составляющих модели. И здесь можно только догадываться, о таких вопросах, как: каким образом составляющие объекты включаются в суммарный, что суммарному известно о составляющих (h-файлы с классами; интерфейсы на самодельные классы, их реализующие; модель COM), кто и каким образом меняет параметры классов (одно дело, внутри класса есть некий GUI, который, возможно, внутри же и вызывается, другое - есть функции get/set, доступные из внешнего модуля). И ещё: те классы и библиотеки нельзя менять принципиально, или просто не хотелось бы? |