2011-05-19 17 views
5

He el siguiente problema ..Boost serialización/deserialización archivo "error de corriente" excepción

tengo un archivo llamado A.h y un archivo B.H. cada uno contiene alguna estructura como esta: (las estructuras dentro de las dos clases son diferentes)

struct Base 
{ 
    friend class access; 

    template <typename Archive> 
    void serialize(Archive& ar,const unsigned int version) 
    { 
     ar & fieldLength; 
     ar & fieldMD; 
     ar & fieldTime_Stamp; 
    } 
    public: 
     unsigned int fieldLength; 
     unsigned int fieldMD; 
     unsigned int fieldTime_Stamp; 

     virtual void f(){} //to be polymorphic the struct 
}; 

struct Derived:public Base 
{ 
    ... 
} 

Así que serializar el struct a la manera clásica:

.... 

std::ostringstream archive_stream; 

boost::archive::text_oarchive archive(archive_stream); 

archive.register_type(static_cast<Derived*>(NULL)) 

archive <<p; // where p is a pointer to Base 

ahora el problema ... en la lado de deserialización, sigo el mismo procedimiento (inverso) ... si deserializo singularmente las estructuras en Ah (sin incluir en el proyecto Bh) y las estructuras en Bh (sin incluir en el proyecto Ah) todo funciona ... pero Si incluyo en el proyecto ambas clases, la deserialización funciona para una clase, pero arroja la "excepción de error de secuencia" en el arco de instrucciones " colmena >> m; " para el otro ... parece un conflicto en la clase de registro o algo así ... ¿Alguna idea? Gracias ...

+0

Muestre su código de deserialización real. – ildjarn

+0

std :: istringstream archive_stream (mex); // mex es la información serializada recibida del socket \t boost :: archive :: text_iarchive archive (archive_stream); archive.register_type (static_cast (NULL)); ... \t Base * m; archivo >> m; – marco

+0

He observado que tengo un conflicto en el registro de la clase a través del archivo.register_type(), a pesar de que creo dos (local) text_iarchive en procesos separados (utilizo el tenedor) ... de hecho, si hago un comentario el código de registro del segundo proceso, todo funciona ... ¿cómo es posible? – marco

Respuesta

2

¿Ha serializado los datos base en la función de serialización de clase derivada?

ar & boost::serialization::make_nvp("base", boost::serialization::base_object<Base>(*this)); 

y no sé si esto ayudaría, pero yo uso

BOOST_CLASS_IMPLEMENTATION(x, boost::serialization::object_serializable); 
BOOST_CLASS_TRACKING(x, boost::serialization::track_never) 

para registrar las clases como serialiseable. Espero que ayude: 3

Cuestiones relacionadas