2010-11-18 29 views
0

J'ai une classe de base et 4 classes dérivées. Je stocke toutes mes classes dérivées dans un vecteur de type pointeur de classe de base. Lors de la première initialisation, je crée différemment chaque type dérivé en utilisant leurs constructeurs. Fondamentalement, ils ont chacun différents types de param dans leurs ctors. (J'ai dû fournir un ctor par défaut protégé pour faire BOOST_CLASS_EXPORT compiler mais c'est une histoire différente). Je ne peux/ne peux pas enregistrer tous les membres (remplis dans ctor) de ces classes dérivées.boost :: initialisation de type polymorphe de sérialisation

Maintenant, lorsque je charge des objets à partir du disque en utilisant boost :: serialize, ces membres (qui ne sont pas sérialisés et spécifiques à chaque type dérivé) sont détruits. Et, je ne peux pas penser à un moyen de ré-initialiser ces types dérivés puisque je stocke seulement les pointeurs de classe de base.

Qu'est-ce exactement que j'ai besoin est d'être capable de charger mes types dérivés (pointeurs) partiellement, sans supprimer tout leur contenu ..

est-il un moyen de surmonter ce problème, un coup de pouce magique définir ou appel de fonction peut-être? Sinon, le polymorphisme avec boost :: serialize n'est pas possible du tout. Je devrais manquer quelque chose et espérer pouvoir définir mon problème assez bien.

Répondre

0

Vous ne devriez pas avoir besoin de créer un constructeur par défaut juste pour la sérialisation. Vous pouvez à la place avoir boost sauvegarder/charger les données nécessaires à un constructeur non-par défaut, et l'utiliser pour construire de nouveaux objets lors du chargement. Ainsi, tout ce que font vos constructeurs pour garantir la validité des membres de données peut également se produire pendant la sérialisation, et la bibliothèque de sérialisation n'a jamais à manipuler directement les membres de données de vos objets. Cela devrait empêcher l'effacement des données.

Par exemple, si votre classe peut être construit en utilisant un name et un size, vous pouvez surcharger les fonctions comme suit:

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 
} 

Vérifiez les docs here.