2011-06-02 63 views
8

我想序列化一个类使用boost序列化库的字符串,并在我的课程中包含几个双成员变量。boost序列化和双打

下面是代码我使用序列化:

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

这里是我的Point类中的方法serialiation:

friend class boost::serialization::access; 

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

当我序列化到一个字符串,升压不似乎可以像我所期望的那样处理双重字符串转换(这似乎是四舍五入的问题)。研究一下它看起来像其他人报道了相同的行为。我也理解与将double转换为字符串相关的精度相关问题,以及如何导致问题。

什么是奇怪的,我不明白,虽然这似乎并没有发生,当我使用stringstream本身和重定向双流到流,或者当我使用boost的lexical_cast函数从stringstream转换。 str()返回一个double。在发现boost有它自己的序列化/反序列化类之前,我实际上使用stringstream和lexical_cast调用编写了自己的代码,并且它没有问题。我真的希望我不必放弃序列化库,回到以前的版本。希望有一些设置/特征/等。我丢了。

+0

明显的和愚蠢的建议是序列化的二进制数据,而不是作为一个字符串?也许这是解决方案?再一次,如果这很容易,你可能会做到这一点...... :)如果没有答案和我的好奇心找出解决方案,我不会提供我的建议。 :) – NoSenseEtAl 2011-06-03 22:36:15

+0

boost的lexical_cast具有相当复杂的逻辑来设置流的精确度 - 请参阅http://www.boost.org/doc/libs/1_46_1/boost/detail/lcast_precision.hpp – 2011-06-05 15:51:31

+0

您可以举一个例子做和不做正确的往返? – 2011-06-05 16:22:22

回答

2

你可以尝试连载到它之前迫使你的流用科学的格式浮点:

ss << std::scientific; 

它看起来像boost库正确设置的精度,但不会出现设置格式。或者,您可以推导并覆盖保存和/或加载浮点数的逻辑,而不会丢弃库的其余部分 - 开始here

它也像有work in progress扶持无穷等​​

+0

我也修改了类来表示我的数据元素为float,而不是double,它看起来也是这样做的,至少解决了序列化问题。 – 2011-06-13 17:57:54