2009-03-20 12 views
6

Sto utilizzando Boost.Serialization per archiviare il contenuto di una classe. Una delle variabili membro è uno statico std :: vector.membri statici e serializzazione potenziata

L'archiviazione e il ripristino vanno bene, ma speravo che la libreria salvi i membri statici una volta sola, sembra che, a giudicare dal file, i membri statici siano completamente salvati per ogni istanza archiviata.

Questo è piuttosto facilmente aggirato utilizzando set/getter per il vettore statico e serializzando il vettore statico al di fuori della classe una volta.

Ma preferirei avere una classe autonoma. C'è un modo semplice e pulito per ottenere l'archiviazione dei contenuti statici di una classe solo una volta?

risposta

2

Serializza il vettore statico prima di serializzare tutte le istanze della classe.

Se si serializzare il vettore in questo modo:

template<class Archive> 
void serialize(Archive & ar, const unsigned int version) 
{ 
    ar & this->someVar; 
    ar & this->AnotherVar; 
    ar & staticVector; 
} 

Poi certo, il vettore statico venga serializzato con ogni istanza.

Per ulteriori chiarimenti, inserire la propria funzione serialize e la funzione che la richiama, per favore.

+1

Non penso che sia così "sicuro" ad essere onesti. Dal momento che l'istanza statica risiede nello stesso indirizzo di memoria per ogni istanza di classe, speravo che la libreria lo riprendesse in qualche modo e fosse abbastanza intelligente da non scrivere il vettore ogni volta per archiviare. – Pieter

+0

Inizializzare prima il vettore, e poi tutte le istanze, è il "facilmente aggirato" di cui stavo parlando, come ho detto preferirei un serialize autonomo() per la mia classe ... Ma se questo non può essere fatto serializzare il vettore prima è quello che rimarrò anche io ovviamente (è così che funziona ora ...) – Pieter

+0

Certo, Boost serializza quello che dici di serializzare, indipendentemente dalla sua posizione di memoria, non può . Dove sarebbe memorizzata la sezione statica, se in qualche modo funzionasse magicamente? All'inizio, alla fine, nel mezzo? Un modo sarebbe usare un flag come "serializzato". – arul

1

Ho esperienza molto limitata con Boost.Serialization, quindi perche quanto segue di conseguenza:

IIRC, il trattamento si desidera per il membro statico è ciò che viene fatto con i puntatori. Quindi forse la serializzazione di un puntatore al membro statico potrebbe funzionare.

Autocritica: non sono sicuro di come possa essere applicato durante la serializzazione.