Boost logo

Boost Users :

Subject: Re: [Boost-users] Customizing locale of stream for Boost.Serialization seems to fail
From: Christophe Fuzier (fuzierc_at_[hidden])
Date: 2014-03-11 10:15:43


Hi,

I have found the solution to my problem and posted it there:
http://stackoverflow.com/questions/22203496/deserialization-of-non-finite-floating-point-numbers-fails-even-with-appropriate/22328343#22328343

Christophe Fuzier

2014-03-10 11:06 GMT+01:00 Christophe Fuzier <fuzierc_at_[hidden]>:

> Hi,
>
> I have a problem with Boost.Serialization. I have posted a question on a
> forum but have not got any answer until now. Here is the reproduction of my
> post (note: I'm using Boost 1.48, patch level 0).
>
> I need to use Boost.Serialization to serialize floating-point numbers.
> Since NaN and infinites cannot natively be read from an input stream, I am
> trying to use the facets in boost/math/special_functions. I have tested
> them on my platform using code similar to the examples we can find here:
> http://www.boost.org/doc/libs/1_50_0/libs/math/doc/sf_and_dist/html/math_toolkit/utils/fp_facets/intro.html
>
> However, the following code still fails to properly unserialize non-finite
> floating point values (an exception is thrown with description "input
> stream error").
> #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;
> }
>
> Am I doing something wrong? Is there a problem with my Boost version or my
> platform? Is there a better solution? Any help would be greatly appreciated.
>
> <END OF POST>
> Thank you in advance for any suggestion.
>
> Christophe Fuzier
>



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net