| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Запись кучи полиморфных объектов на диск |
| Автор: georain 24.8.2007, 20:30 |
| Здравствуйте, подскажите пожалуйста. Есть дерево полиморфных классов Есть своя куча и свой менеджер В этой куче хранятся мои полиморфные объекты Есть массив с относительными указателями на объекты в этой куче Я хочу записать мою кучу на диск, перезапустить приложение, загрузить её и снова с ней работать. Как это можно сделать не нарушая работы виртуальных функций? Принцип работы виртуальных функций я знаю. Возможно ли тут что-то с виртуальным адресным пространством? |
| Автор: MAKCim 24.8.2007, 21:02 |
| georain, создай виртуальные методы save() и load() и в каждом классе их реализуй |
| Автор: georain 24.8.2007, 21:09 |
| Ну хотелось бы сразу всем скопом записать, просто у меня этих объектов под 1е9 |
| Автор: MAKCim 24.8.2007, 21:22 |
| georain, в объектах полиморфных классов есть указатели на другие объекты (или что-то, чей реальный размер не известен изначально)? |
| Автор: georain 24.8.2007, 23:08 |
| Нет, никаких указателей у классов нету, единственная проблема заключается в указателях на списки виртуальных функций. |
| Автор: georain 26.8.2007, 00:44 |
| Что-то я не очень понял как сериализация с полиморфными классами обходится, Как в сохранённом объекте представлен тип класса? Ведь при загрузке класса я не знаю его тип. И если я хочу сам написать функцию сохранения для кажого класса отдельно, как мне записать информацию о классе для его восстановления (но не имя класса |
| Автор: MAKCim 26.8.2007, 09:35 |
| georain, фабрика объектов тебе поможет тип может быть представлен числовой константой |
| Автор: bsa 26.8.2007, 11:09 | ||
А можно и RTTI (typeid) воспользоваться. |
| Автор: MAKCim 26.8.2007, 11:23 |
| bsa, а как ты будешь восстанавливать объект? с помощью typeid(...).name() можно записать в файл строку (которая идентифицирует класс объекта) непосредственно перед данными объекта а как восстанавливать по строке? |
| Автор: zkv 26.8.2007, 16:01 | ||
| georain, может не изобретать велосипед? Я пользуюсь МФСшной сериализацией, объекты "сами" восстанавливаются можно юзать http://www.boost.org/libs/serialization/doc/index.html
думаю здесь решающую роль будет играть время записи(чтения) на(с) диск(а). А в реализациях сериализаций уже продумана буферизация данных. (ужас, что сказал |
| Автор: JackYF 26.8.2007, 20:02 | ||
классно, причем верно. P.S. энтропия фрактальных систем неаддивна. По сабжу - либо своя маленькая реализация, либо boost::serialization. |
| Автор: georain 26.8.2007, 23:17 |
То есть я для каждого класса сам придумываю число? Или может это число можно от куда-нибудь выдернуть? http://www.boost.org/libs/serialization/doc/index.html штука хорошая, но несколько громозкая. Хочу иметь одну функцию в базовом классе для сохранения в бинарном виде! Размер получу из виртуальной функции my_size(), всё равно она уже есть. Как же класс идентифицировать? |
| Автор: zkv 27.8.2007, 00:25 |
| georain, советую посмотреть сначала сюда: http://www.insidecpp.ru/antipatterns/premature_optimization/ и сюда: http://www.insidecpp.ru/antipatterns/reinventing_the_wheel/. После осмысления сюда: http://www.insidecpp.ru/patterns/factory/, если останется желание велосипед доделывать Добавлено через 2 минуты и 59 секунд интересно стало, чем это она громоздкая? |
| Автор: MAKCim 27.8.2007, 08:52 | ||
|
| Автор: georain 27.8.2007, 15:21 |
| MAKCim, Спасибо, это довольно удобно ну у меня всё что больше 3-х строчек громоздкое В общем выводы такие: В записи кусков raw памяти смысла нет, потому что в основном скорость определяет HDD, и во время записи можно легко совершать операции с классами, в том числе буферизацию. Также записываем не классы, а содержащиеся в них данные. Для записи либо используем библиотеки сериализации, например http://www.boost.org/libs/serialization/doc/index.html, что удобно и проверенно, либо пишем свои виртуальные велосипедные методы save() и load() для каждого класса и используем фабрику объектов. |