2012-11-19 7 views
6

Sto osservando Boost.Serialization per la prima volta e non riesco a trovare una valutazione chiara (o istruzioni) riguardante la serializzazione di una struttura di ereditarietà virtuale del diamante.Boost.Serialization funziona direttamente con l'ereditarietà virtuale dei diamanti?

Si consideri il seguente gerarchia di classe:

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; } 

Qual è il modo (si spera, semplice) adeguata per implementare la serializzazione all'interno di tutte queste classi utilizzando Boost.Serialization?

Nota: non ci sono puntatori o membri di classe di riferimento che devono essere serializzati. Nota: sono felice di usare dynamic_cast<> per assicurare che qualsiasi puntatore o riferimento a qualsiasi classe in questa gerarchia sia del tipo desiderato, derivato-più: sono semplicemente preoccupato di come garantire correttamente e in modo pulito che tutte le classi BASE i membri dei dati sono correttamente serializzati e deserializzati, insieme alla classe corrente che viene serializzata.

+0

Potrebbe essere un po 'problematico utilizzare la serializzazione perché è una classe modello, se si utilizzano metodi virtuali: http://stackoverflow.com/questions/10490245/virtual-functions-and-template-clash –

+0

@Ben Credo che il problema nella domanda collegata riguardi le * basi * astratte * (cioè, le classi base con * pure * funzioni virtuali) solo, perché tali classi non possono essere istanziate, e quindi è impossibile istanziare il 'serialize() richiesto funzione all'interno di tale classe. Non credo che le funzioni virtuali abbiano un impatto su Boost.Serialization altrimenti - in realtà, sono specificatamente dati e solo dati, che sono serializzati, quindi penso che la presenza di funzioni virtuali sia, in sostanza, irrilevante a Boost.Serialization tranne che indirettamente, come nell'esempio nel link. –

+0

@Ben Il seguente collegamento sembra presentare un modo ben supportato per utilizzare Boost.Serialization con classi di base astratte: http://stackoverflow.com/questions/1332602/how-to-serialize-derived-template-classes-with- boost-serialize –

risposta

2

Quando la serializzazione di oggetti con classi base virtuali, sarà necessario attivare in modo esplicito oggetto di monitoraggio per le classi base virutal:

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

Da object tracking:

In una struttura di diamante eredità con un virtuale classe base, il monitoraggio degli oggetti previene le chiamate ridondanti di salvataggio/caricamento. Quindi, ecco un caso in cui potrebbe essere conveniente ignorare il tratto di tracciamento predefinito. (Nota: in una versione futura il default verrà reimplementato per tracciare automaticamente le classi usate come basi virtuali).

Quanto de/serializzazione classi base, uso:

archive & BOOST_SERIALIZATION_BASE_OBJECT_NVP(base_class); 

prima serializzazione variabili utente (archive & BOOST_SERIALIZATION_NVP(variable)) con intrusive serialization. Per la serializzazione non-intrusive tocca a te gestire tutte le variabili membro coinvolte.

Tutto ciò si basa sul presupposto che si de/serializzi una classe non polimorfica (con classi di base virtuali) tramite un puntatore o un riferimento del tipo più derivato.

+0

Significa che se ho un puntatore a un oggetto in cui il tipo di puntatore è quello di una classe nel mezzo di una gerarchia "a diamante" a più livelli, ma l'oggetto è esso stesso di un'ulteriore classe derivata - ma la classe corrispondente a questo tipo di puntatore * È * un tipo polimorfico (vale a dire, ha almeno una funzione virtuale definita e quindi ha un vtable) che Boost.La serializzazione serializzerà correttamente l'oggetto INCLUDENDO fino in fondo ai suoi membri della classe derivata (vale a dire anche se il puntatore punta a un tipo di classe base)? –

+0

@DanNissenbaum Se si dispone di una gerarchia polimorfico è necessario sia [esportazione o registrati] (http://www.boost.org/doc/libs/1_52_0/libs/serialization/doc/serialization.html#derivedpointers) la classe per serializzazione attraverso un puntatore a un tipo meno derivato. Inoltre devi deserializzare sullo stesso tipo di serializzazione (tipi diversi non sono stati testati nei test di boost :: serialization unit). –

+0

@AnonymousCoward è 'BOOST_SERIALIZATION_BASE_OBJECT_NVP' preferito su' boost :: serializzazione :: base_object (* this); '? –

Problemi correlati