boost :: serialization полиморфный тип инициализации - PullRequest
0 голосов
/ 19 ноября 2010

У меня есть базовый класс и 4 производных класса. Я храню все мои производные классы в векторе типа указателя базового класса. Во время первой инициализации я создаю каждый производный тип по-разному, используя их конструкторы. По сути, каждый из них имеет разные типы параметров в своих ctors. (Я должен был предоставить защищенный ctor по умолчанию, чтобы BOOST_CLASS_EXPORT компилировался, но это другая история). Я не могу / не могу сохранить всех членов (заполненных в ctor) этих производных классов.

Теперь, когда я загружаю объекты с диска с помощью boost :: serialize, эти члены (не сериализованные и не специфичные для каждого производного типа) уничтожаются. И я не могу придумать способ реинициализации этих производных типов, поскольку я храню только указатели базового класса.

Что мне нужно, так это возможность частично загружать мои производные типы (указатели), не удаляя все их содержимое.

Есть ли способ преодолеть это, магическое ускорение или вызов функции? В противном случае полиморфизм с boost :: serialize вообще невозможен .. Я должен что-то упустить и надеюсь, что смогу определить свою проблему достаточно хорошо.

1 Ответ

0 голосов
/ 10 февраля 2011

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

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

Например, если ваш класс может быть создан с использованием name и size, вы можете перегрузить функции следующим образом:

template <class Archive>
inline void save_construct_data(Archive & ar, const my_class * t, const unsigned int) {
    ar << my_class->name();
    ar << my_class->size();
}

template<class Archive>
inline void load_construct_data(Archive & ar, my_class * t, const unsigned int) {
    std::string name;
    int size;
    ar >> name;
    ar >> size;
    ::new(t)my_class(name, size); // placement 'new' using your regular constructor
}

Проверкадокументы здесь .

...