提升序列化和双打

时间:2011-06-02 13:47:21

标签: c++ serialization boost floating-point boost-serialization

我正在尝试使用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类中的序列方法:

friend class boost::serialization::access;

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

当我序列化为字符串时,boost似乎没有像我期望的那样处理双字符串到字符串的转换(似乎存在舍入问题)。研究一下,看起来其他人报告了相同的行为。我也理解与将double转换为字符串相关的精度相关问题,反之亦然,以及这可能导致问题。

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

2 个答案:

答案 0 :(得分:2)

在序列化之前,您可以尝试强制您的流使用科学格式表示浮点数:

ss << std::scientific;

看起来boost库正确设置了精度,但似乎没有设置格式。或者,您可以考虑导出并覆盖用于保存和/或加载浮点数的逻辑,而不会丢弃库的其余部分 - 启动here

看起来还有work in progress支持无限等。

答案 1 :(得分:0)

这不会直接回答Boost.Serialization问题,但可能是一种解决方法。

从上面的问题来看,我不清楚你是否需要字符串表示。如果您正在寻找跨平台表示(二进制或其他),请考虑使用protobuf,它确实支持编码double

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