Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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 smile

Автор: MAKCim 24.8.2007, 21:22
georain, 
в объектах полиморфных классов есть указатели на другие объекты (или что-то, чей реальный размер не известен изначально)?

Автор: georain 24.8.2007, 23:08
Нет, никаких указателей у классов нету, единственная проблема заключается в указателях на списки виртуальных функций.

Автор: Daevaorn 24.8.2007, 23:15
Цитата(georain @  25.8.2007,  00:08 Найти цитируемый пост)
единственная проблема заключается в указателях на списки виртуальных функций. 

которых может и не быть вовсе;) Сохранять нудо не куски raw памяти,а объекты
Почитай про http://en.wikipedia.org/wiki/Serialization

Автор: georain 26.8.2007, 00:44
Что-то я не очень понял как сериализация с полиморфными классами обходится,
Как в сохранённом объекте представлен тип класса?
Ведь при загрузке класса я не знаю его тип.

И если я хочу сам написать функцию сохранения для кажого класса отдельно,
как мне записать информацию о классе для его восстановления (но не имя класса smile )?

Автор: MAKCim 26.8.2007, 09:35
georain, 
фабрика объектов тебе поможет
тип может быть представлен числовой константой

Автор: bsa 26.8.2007, 11:09
Цитата(MAKCim @ 26.8.2007,  09:35)
georain, 
фабрика объектов тебе поможет
тип может быть представлен числовой константой

А можно и RTTI (typeid) воспользоваться.

Автор: MAKCim 26.8.2007, 11:23
bsa, 
а как ты будешь восстанавливать объект?
с помощью typeid(...).name() можно записать в файл строку (которая идентифицирует класс объекта) непосредственно перед данными объекта
а как восстанавливать по строке?

Автор: zkv 26.8.2007, 16:01
georain, может не изобретать велосипед?
Я пользуюсь МФСшной сериализацией, объекты "сами" восстанавливаются smile
можно юзать http://www.boost.org/libs/serialization/doc/index.html
Цитата(georain @  24.8.2007,  21:09 Найти цитируемый пост)
Ну хотелось бы сразу всем скопом записать, просто у меня этих объектов под 1е9

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

Автор: JackYF 26.8.2007, 20:02
Цитата(zkv @  26.8.2007,  16:01 Найти цитируемый пост)
А в реализациях сериализаций уже продумана буферизация данных. (ужас, что сказал  smile ) 

классно, причем верно.

P.S. энтропия фрактальных систем неаддивна.

По сабжу - либо своя маленькая реализация, либо boost::serialization.

Автор: georain 26.8.2007, 23:17
Цитата(MAKCim @  26.8.2007,  09:35 Найти цитируемый пост)
тип может быть представлен числовой константой

То есть я для каждого класса сам придумываю число?
Или может это число можно от куда-нибудь выдернуть?

http://www.boost.org/libs/serialization/doc/index.html штука хорошая, но несколько громозкая.

Хочу иметь одну функцию в базовом классе для сохранения в бинарном виде! smile
Размер получу из виртуальной функции my_size(), всё равно она уже есть.
Как же класс идентифицировать?  smile 

Автор: 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/, если останется желание велосипед доделывать smile

Добавлено через 2 минуты и 59 секунд
Цитата(georain @  26.8.2007,  23:17 Найти цитируемый пост)
boost::serialization штука хорошая, но несколько громозкая.

интересно стало, чем это она громоздкая? 

Автор: MAKCim 27.8.2007, 08:52
Цитата(georain @  26.8.2007,  23:17 Найти цитируемый пост)
Как же класс идентифицировать?

Код

typedef base * (*constructor_t)();
constructor_t constructors[CLASSES_COUNT] = {
    A :: create,
    B :: create,
...
    Z :: create
};

enum {
    A_UNIQ_NUM = 0,
    B_UNIQ_NUM,
...
    Z_UNIQ_NUM
};

class A : public base {
public:
...
    static base * create() { return new A(); }
    virtual int uniq() const { return A_UNIQ_NUM; }
    virtual int size() const { return <size>; }
};

...



Автор: georain 27.8.2007, 15:21
MAKCim, 
Спасибо, это довольно удобно

Цитата(zkv @  27.8.2007,  00:25 Найти цитируемый пост)
интересно стало, чем это она громоздкая? 

ну у меня всё что больше 3-х строчек громоздкое smile

В общем выводы такие:
В записи кусков raw памяти смысла нет, потому что в основном скорость определяет HDD, и во время записи можно легко совершать операции с классами, в том числе буферизацию.
Также записываем не классы, а содержащиеся в них данные.
Для записи либо используем библиотеки сериализации, например http://www.boost.org/libs/serialization/doc/index.html, что удобно и проверенно, либо пишем свои виртуальные велосипедные методы save() и load() для каждого класса и используем фабрику объектов.

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