Десериализация не конечных чисел с плавающей точкой терпит неудачу даже с соответствующими гранями

Мне нужно использовать Boost.Serialization для сериализации чисел с плавающей точкой. Поскольку NaN и бесконечности не могут быть изначально считаны из входного потока, я пытаюсь использовать аспекты в boost / math / special_functions. Я проверил их на своей платформе, используя код, похожий на примеры, которые мы можем найти здесь: http://www.boost.org/doc/libs/1_50_0/libs/math/doc/sf_and_dist/html/math_toolkit/utils/fp_facets/intro.html
Тем не менее, следующий код по-прежнему не может правильно десериализовать бесконечные значения с плавающей запятой (исключение выдается с описанием «ошибка входного потока»).

#include <limits>
#include <locale>
#include <sstream>

#include <boost/archive/xml_iarchive.hpp>
#include <boost/archive/xml_oarchive.hpp>
#include <boost/math/special_functions/nonfinite_num_facets.hpp>
#include <boost/serialization/nvp.hpp>

struct Data {
float f;

Data() : f(std::numeric_limits<float>::quiet_NaN()) {}

template <class Archive>
void serialize(Archive & ar, unsigned const)
{
ar & BOOST_SERIALIZATION_NVP(f);
}
};

void test()
{
using namespace boost::archive;
Data d;
std::ostringstream oss;
xml_oarchive oar(oss);
oar << BOOST_SERIALIZATION_NVP(d);
//std::cout << oss.str() << std::endl;
std::istringstream iss(oss.str());
std::locale const new_loc(iss.getloc(), new boost::math::nonfinite_num_get<char>);
iss.imbue(new_loc);
xml_iarchive iar(iss);
iar >> BOOST_SERIALIZATION_NVP(d);
std::cout << d.f << std::endl;
}

Я делаю что-то неправильно? Есть ли проблема с моей версией Boost или моей платформой? Есть ли лучшее решение? Любая помощь будет принята с благодарностью.

2

Решение

Я нашел решение, прочитав следующую заметку о реализации:
http://www.boost.org/doc/libs/1_55_0/libs/serialization/doc/implementation.html#charencoding

При построении архива с флагом по умолчанию локаль потока изменяется на решение проблем кодировки символов, но этот механизм можно отключить с помощью флага boost::archive::no_codecvt,

Если я заменю линию

xml_iarchive iar(iss);

с

xml_iarchive iar(iss, no_codecvt);

тогда это работает.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]