2

I cannot serialize boost::rational<int>. I searched for a boost/serialize/rational.h header but it does not exist.

 /usr/include/boost/serialization/access.hpp:118:9: error: ‘class boost::rational<int>’ has no member named ‘serialize’

Is there a way to achieve it?

4

2 回答 2

2

只需序列化分子和分母。

这是半通用形式的工作(支持带有命名节点的存档,也像 XML 序列化):Live On Coliru

#include <boost/archive/xml_iarchive.hpp>
#include <boost/archive/xml_oarchive.hpp>
#include <boost/serialization/serialization.hpp>
#include <boost/rational.hpp>
#include <iostream>

namespace boost { namespace serialization {

    template <typename Archive, typename T>
        void save(Archive& ar, ::boost::rational<T> const& r, unsigned /*version*/)
        {
            int n = r.numerator(), d = r.denominator();
            ar & boost::serialization::make_nvp("numerator", n);
            ar & boost::serialization::make_nvp("denominator", d);
        }

    template <typename Archive, typename T>
        void load(Archive& ar, ::boost::rational<T>& r, unsigned /*version*/)
        {
            int n, d;
            ar & boost::serialization::make_nvp("numerator", n);
            ar & boost::serialization::make_nvp("denominator", d);

            r = ::boost::rational<T>(n, d);
        }

} }

BOOST_SERIALIZATION_SPLIT_FREE(boost::rational<int>);

using namespace boost;
#include <iostream>
#include <sstream>

int main()
{
    rational<int> number(2, 3), other;

    std::stringstream ss;
    {
        archive::xml_oarchive oa(ss);
        oa << serialization::make_nvp("rational", number);
    }

    std::cout << "Serialized: '" << ss.str() << "'\n";

    {
        archive::xml_iarchive ia(ss);
        ia >> serialization::make_nvp("rational", other);
    }

    std::cout << "Deserialized: " << other;
}

印刷

Serialized: '<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE boost_serialization>
<boost_serialization signature="serialization::archive" version="10">
<rational class_id="0" tracking_level="0" version="0">
    <numerator>2</numerator>
    <denominator>3</denominator>
</rational>
</boost_serialization>

'
Deserialized: 2/3
于 2014-03-21T16:37:20.920 回答
-1

使用提供的输入/输出函数:https ://www.boost.org/doc/libs/1_64_0/libs/rational/rational.html#Input%20and%20Output

序列化为std::string

template <typename I>
std::string serialize(boost::rational<I>& rational) const {
  std::stringstream rational_ss;

  rational_ss << rational;
  return rational_ss.str();
}

这会将有理数序列化为一个看起来像"3/5"例如的字符串

要反序列化,请使用boost::rational's >>

于 2020-10-18T04:22:15.703 回答