Dav*_*une 8 c++ floating-point serialization boost 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;
Run Code Online (Sandbox Code Playgroud)
这是我的Point类中的序列方法:
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
if (version > 0)
{
ar & mLatitude;
ar & mLongitude;
}
}
Run Code Online (Sandbox Code Playgroud)
当我序列化为字符串时,boost似乎没有像我期望的那样处理双字符串到字符串的转换(似乎存在舍入问题).研究一下,看起来其他人报告了相同的行为.我也理解与将double转换为字符串相关的精度相关问题,反之亦然,以及这可能导致问题.
有什么奇怪的,我不明白,虽然当我使用stringstream本身并将double重定向到流时,或者当我使用boost的lexical_cast函数从stringstream.str()返回时,这似乎不会发生一双.在发现boost有自己的序列化/反序列化类之前,我实际上已经使用stringstream和lexical_cast调用编写了自己的函数,并且它没有问题.我真的希望我不必放弃序列化库并回到之前的状态.希望只有一些设置/特征/等.我迷路了.
您可以尝试在序列化流之前强制流使用浮点科学格式:
ss << std::scientific;
Run Code Online (Sandbox Code Playgroud)
看起来 boost 库正确设置了精度,但似乎没有设置格式。或者,我可以认为派生并覆盖用于保存和/或加载浮点数的逻辑,而不丢弃库的其余部分 - 从这里开始。
看起来支持无穷大等方面的工作正在进行中。
归档时间: |
|
查看次数: |
2076 次 |
最近记录: |