boost序列化1.5.5崩溃时遇到Nan和Inf [英] boost serialization 1.5.5 crash when meets Nan and Inf
问题描述
似乎boost序列化不能从基于文本的档案中恢复Nan和inf的值。
It seems that boost serialization can't restore the value Nan and inf from text-based archives.
程序将终止,除非你处理 archive_exception
The the program will terminate unless you handle the archive_exception
in this case, any solutions to that ?
推荐答案
这个库的作者有这个说法:
简单的事实是,我从来没有考虑过这个。
The simple truth is I never consider this.
当最后一次我没有真正考虑它,因为我
参与其他事情,我希望intereste [d]双方可能会达成一个
的共识,而不必弯曲我的过度伸展的大脑。
When it came up the last time I didn't really think about it very much as I was involved in other things and I hoped intereste[d] parties might come to a consensus without my having to bend my over-stretched brain.
(继续讨论解决方法)
这看起来是正确的,在我的测试中,只有二进制档案支持inf / nan。
This appears to be correct, in my test only binary archives support inf/nan.
除了nan / inf,Xml和文本档案支持全范围的精度:
Xml and text archives do support the full range of precision, except nan/inf:
using BIA = boost::archive::binary_iarchive;
using BOA = boost::archive::binary_oarchive;
using TIA = boost::archive::text_iarchive;
using TOA = boost::archive::text_oarchive;
using XIA = boost::archive::xml_iarchive;
using XOA = boost::archive::xml_oarchive;
int main() {
// supported:
assert((perform_test<BIA, BOA, use_nan, use_inf, use_range>()));
assert((perform_test<XIA, XOA, no_nan, no_inf, use_range>()));
assert((perform_test<TIA, TOA, no_nan, no_inf, use_range>()));
// not supported:
assert(!(perform_test<XIA, XOA, no_nan, use_inf>()));
assert(!(perform_test<TIA, TOA, no_nan, use_inf>()));
assert(!(perform_test<XIA, XOA, use_nan, no_inf>()));
assert(!(perform_test<TIA, TOA, use_nan, no_inf>()));
}
完整列表
对于后代:
Full Listing
For posterity:
#include <boost/archive/xml_oarchive.hpp>
#include <boost/archive/xml_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/vector.hpp>
#include <sstream>
using namespace boost::archive;
static bool equal_or_nan(double a, double b) {
return (std::isnan(a) && std::isnan(b)) || a==b;
}
template <typename IA, typename OA,
bool withNan = true,
bool withInf = true,
bool withRange = true>
bool perform_test()
{
std::vector<double> const v {
withRange? std::numeric_limits<double>::min() : 0,
withRange? std::numeric_limits<double>::max() : 0,
withRange? std::numeric_limits<double>::epsilon() : 0,
withNan? std::numeric_limits<double>::quiet_NaN() : 0,
withInf? std::numeric_limits<double>::infinity() : 0,
withInf? - std::numeric_limits<double>::infinity() : 0,
};
std::stringstream ss;
{
OA oa(ss);
oa << boost::serialization::make_nvp("element", v);
}
try
{
IA ia(ss);
std::vector<double> w;
ia >> boost::serialization::make_nvp("element", w);
return std::equal(v.begin(), v.end(), w.begin(), equal_or_nan);
} catch(...) {
return false;
}
}
static constexpr bool use_inf = true, use_nan = true, use_range = true;
static constexpr bool no_inf = false, no_nan = false, no_range = false;
using BIA = boost::archive::binary_iarchive;
using BOA = boost::archive::binary_oarchive;
using TIA = boost::archive::text_iarchive;
using TOA = boost::archive::text_oarchive;
using XIA = boost::archive::xml_iarchive;
using XOA = boost::archive::xml_oarchive;
int main() {
// supported:
assert((perform_test<BIA, BOA, use_nan, use_inf, use_range>()));
assert((perform_test<XIA, XOA, no_nan, no_inf, use_range>()));
assert((perform_test<TIA, TOA, no_nan, no_inf, use_range>()));
// not supported:
assert(!(perform_test<XIA, XOA, no_nan, use_inf>()));
assert(!(perform_test<TIA, TOA, no_nan, use_inf>()));
assert(!(perform_test<XIA, XOA, use_nan, no_inf>()));
assert(!(perform_test<TIA, TOA, use_nan, no_inf>()));
}
这篇关于boost序列化1.5.5崩溃时遇到Nan和Inf的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!