2011-06-02 18 views
8

Estoy tratando de serializar una clase en una cadena usando la biblioteca de serialización de refuerzo e incluida en mi clase hay varias variables de miembros dobles.potenciar la serialización y duplicar

A continuación se muestra el código que estoy usando para serializar:

#include <boost/archive/text_oarchive.hpp> 
#include <boost/archive/text_iarchive.hpp> 
#include <boost/serialization/string.hpp> 

std::stringstream ss; 
boost::archive::text_oarchive oa(ss); 
oa << mPoint; 

Aquí es el método serialiation dentro de mi clase Point:

friend class boost::serialization::access; 

template<class Archive> 
void serialize(Archive & ar, const unsigned int version) 
{ 
    if (version > 0) 
    { 
     ar & mLatitude; 
     ar & mLongitude; 
    } 
} 

Cuando serializar en una cadena, no lo hace impulso parecen manejar la conversión de doble a cadena como era de esperar (parece que hay problemas de redondeo). Investigando un poco, parece que otros han informado del mismo comportamiento. También entiendo los problemas relacionados con la precisión asociados con la conversión de un doble a una cadena y viceversa y cómo esto podría causar el problema.

Lo que es extraño y no entiendo es que esto no parece suceder cuando estoy usando un stringstream y redirigiendo el doble a la transmisión ni cuando uso la función lexical_cast de boost para convertir desde un stringstream. str() vuelve a un doble. Antes de descubrir que boost tenía sus propias clases de serialización/deserialización, en realidad había escrito el mío usando cadenas de caracteres y llamadas lexical_cast y funcionaba sin problemas. Realmente espero no tener que abandonar la biblioteca de serialización y volver a lo que tenía antes. Con suerte, solo hay algunos ajustes/características/etc. Estoy perdido.

+0

sugerencia obvia y estúpida sería serializarlo como datos binarios, no como una cadena? Tal vez esa es la solución? De nuevo, si fue así de fácil, probablemente ya lo harías ... :) No estaría ofreciendo mi consejo si no hubiera pasado mucho tiempo sin respuesta y mi curiosidad por encontrar la solución. :) – NoSenseEtAl

+0

boost lexical_cast tiene una lógica compleja para establecer la precisión de la secuencia de forma adecuada - ver http://www.boost.org/doc/libs/1_46_1/boost/detail/lcast_precision.hpp –

+0

¿Puedes dar un ejemplo de valores que hacer y no hacer un viaje redondo correctamente? –

Respuesta

2

usted podría intentar forzar su flujo de utilizar el formato científico de punto flotante antes serialising a ella:

ss << std::scientific; 

Parece que la biblioteca impulso establece la precisión correcta, pero no aparece para establecer el formato. Alternativamente, puedo pensar derivar y anular la lógica para guardar y/o cargar números de coma flotante sin tirar el resto de la biblioteca - comience por here.

También parece que hay work in progress en infinidades de apoyo etc.

+0

También había modificado la clase para representar mis elementos de datos como float en lugar de double, que parecía hacer lo mismo y al menos resolvió mi problema con respecto a la serialización. –

0

Esto no responde directamente la pregunta Boost.Serialization, pero es una posible solución.

De la pregunta anterior, no está claro para mí que necesite una representación de cadena o no. Si busca una representación multiplataforma (binaria u otra), considere usar protobuf, que sí admite la codificación double s.

http://code.google.com/apis/protocolbuffers/docs/proto.html#scalar