2009-03-20 39 views
6

Estoy usando Boost.Serialization para archivar el contenido de una clase. Una de las variables miembro es un std :: vector estático.miembros estáticos y aumentar la serialización

Archivar y restaurar va bien, pero esperaba que la biblioteca guardara miembros estáticos solo una vez, parece que, a juzgar por el tamaño del archivo, los miembros estáticos se guardan completamente para cada instancia archivada.

Esto se elude fácilmente utilizando set/getters para el vector estático y serializando el vector estático fuera de la clase una vez.

Pero prefiero tener una clase independiente. ¿Existe una manera limpia y fácil de lograr archivar los contenidos estáticos de una clase solo una vez?

Respuesta

2

Serialice el vector estático antes de serializar todas las instancias de la clase.

Si serializar el vector de la siguiente manera:

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

Entonces seguro, el vector estática pone en serie con cada instancia.

En caso de necesitar más aclaraciones, publique su función serialize y la función que invoca, por favor.

+1

No creo que sea tan "seguro" para ser honesto. Dado que la instancia estática reside en la misma dirección de memoria para cada instancia de clase, esperaba que la biblioteca captara eso de alguna manera y fuera lo suficientemente inteligente como para no escribir el vector cada vez que archivara. – Pieter

+0

Serializar primero el vector, y luego todas las instancias, es el 'fácil eludir' al que me refería, ya que dije que preferiría tener una serialización independiente() para mi clase ... Pero si eso no puede Ser hecho serializar el vector primero es lo que voy a pegar también por supuesto (así es como funciona ahora ...) – Pieter

+0

Es seguro, Boost serializa lo que le dices a serializar, independientemente de su ubicación de memoria, no puede adivinar eso salvajemente . ¿Dónde estaría la sección estática almacenada, si de alguna manera funcionara mágicamente? Al principio, al final, en el medio? Una forma sería usar una bandera como 'serializada'. – arul

1

que tienen muy poca experiencia con Boost.Serialization, así que por favor considere lo siguiente consecuencia:

IIRC, el tratamiento que desea para su miembro estático es lo que se hace con los punteros. Entonces, quizás serializar un puntero al miembro estático funcionaría.

Autocrítica: No estoy seguro de cómo se podría aplicar eso al deserializar.

Cuestiones relacionadas