2012-11-19 2 views
6

Je regarde Boost.Serialization pour la première fois, et je ne peux pas trouver une évaluation claire (ou des instructions) concernant la sérialisation d'une structure virtuelle d'héritage de diamant.Boost.Serialization fonctionnera directement avec l'héritage virtuel de diamant?

Tenir compte de la hiérarchie de classe suivante:

class A { int a; } 

class B1 : public virtual A { int b1; } 

class B2 : public virtual A { int b2; } 

class B3 : public virtual A { int b3; } 

class C12 : public virtual B1, public virtual B2 { int c12; } 

class C13 : public virtual B1, public virtual B3 { int c13; } 

class C23 : public virtual B2, public virtual B3 { int c23; } 

class D123 : public virtual C12, public virtual C13, public virtual C23 { int d123; } 

Quel est le bon (je l'espère, simple) façon de mettre en œuvre sérialisation au sein de toutes ces classes à l'aide Boost.Serialization?

Remarque: Il n'existe aucun pointeur ou membre de classe de référence devant être sérialisé. Notez également: Je suis heureux d'utiliser dynamic_cast<> pour m'assurer que les pointeurs ou les références à toutes les classes de cette hiérarchie sont du type désiré, dérivé le plus: Je suis simplement préoccupé par la manière de garantir correctement et proprement que toutes les classes BASE les membres de données sont correctement sérialisés et désérialisés, avec la classe en cours de sérialisation.

+0

Vous pouvez avoir un peu de difficulté à utiliser sérialisation parce qu'il est une classe de modèle, si vous utilisez des méthodes virtuelles: http://stackoverflow.com/questions/10490245/virtual-functions-and-template-clash –

+0

@Ben Je crois que le problème dans la question liée concerne uniquement les classes de base * abstract * (c'est-à-dire les classes de base avec * pure * virtual functions), car ces classes ne peuvent pas être instanciées et donc impossible d'instancier le 'serialize()' fonctionner dans une telle classe. Je ne crois pas que les fonctions virtuelles impactent Boost.Serialization autrement - en fait, c'est spécifiquement des données, et des données seulement, qui est sérialisé, donc je penserais que la présence de fonctions virtuelles est, fondamentalement, sans rapport avec Boost.Serialization sauf indirectement, comme dans l'exemple dans le lien. –

+0

@Ben Le lien suivant semble présenter une manière bien supportée d'utiliser Boost.Serialization avec des classes de base abstraites: http://stackoverflow.com/questions/1332602/how-to-serialize-derived-template-classes-with- boost-serialize –

Répondre

2

Lors de la sérialisation des objets avec des classes de base virtuelles, vous devez activer explicitement le suivi des objets pour les classes de base virutal:

BOOST_CLASS_TRACKING(virtual_base, boost::serialization::track_always) 

De object tracking:

Dans une structure de Heritance de diamant avec un virtuel classe de base, le suivi des objets empêchera les invocations de sauvegarde/chargement redondantes. Donc, voici un cas où il pourrait être pratique de remplacer le trait de suivi par défaut. (Remarque: dans une future version, la valeur par défaut sera réimplémentée pour suivre automatiquement les classes utilisées comme bases virtuelles).

En ce qui concerne de/sérialisation classes de base, utilisez:

archive & BOOST_SERIALIZATION_BASE_OBJECT_NVP(base_class); 

avant sérialisation variables membres (archive & BOOST_SERIALIZATION_NVP(variable)) avec intrusive serialization. Pour la sérialisation non-intrusive, c'est à vous de gérer toutes les variables membres impliquées. Tout ceci est basé sur l'hypothèse que vous de/sérialiser une classe non polymorphe (avec des classes de base virtuelles) à travers un pointeur ou une référence du type le plus dérivé.

+0

Cela signifie-t-il que si j'ai un pointeur vers un objet où le type de pointeur est celui d'une classe au milieu d'une hiérarchie de "losange" à plusieurs niveaux, mais que l'objet est lui-même dérivé d'une autre classe? la classe correspondant à ce type de pointeur * EST * un type polymorphe (ie, il a au moins une fonction virtuelle définie et a donc une vtable) que Boost.La sérialisation sérialisera correctement l'objet INCLUANT jusqu'à ses membres les plus dérivés (c'est-à-dire même si le pointeur pointe vers un type de classe de base)? –

+0

@DanNissenbaum Si vous avez une hiérarchie polymorphe, vous devez soit [exporter ou enregistrer] (http://www.boost.org/doc/libs/1_52_0/libs/serialization/doc/serialization.html#derivedpointers) la classe pour sérialisation via un pointeur vers un type moins dérivé. De plus, vous devez désérialiser au même type que vous sérialiser (différents types ne sont pas testés dans les tests d'unité boost :: serialization). –

+0

@AnonymousCoward Est-ce que 'BOOST_SERIALIZATION_BASE_OBJECT_NVP' est préférable à' boost :: serialization :: base_object (* ceci); '? –

Questions connexes