Serialization 如何序列化boost::rational

Serialization 如何序列化boost::rational,serialization,boost,rational-numbers,Serialization,Boost,Rational Numbers,我无法序列化boost::rational。我搜索了boost/serialize/rational.h头,但它不存在 /usr/include/boost/serialization/access.hpp:118:9: error: ‘class boost::rational<int>’ has no member named ‘serialize’ /usr/include/boost/serialization/access.hpp:118:9:错误:“class boo

我无法序列化
boost::rational
。我搜索了boost/serialize/rational.h头,但它不存在

 /usr/include/boost/serialization/access.hpp:118:9: error: ‘class boost::rational<int>’ has no member named ‘serialize’
/usr/include/boost/serialization/access.hpp:118:9:错误:“class boost::rational”没有名为“serialize”的成员

有什么方法可以实现吗?

只需序列化分子和分母即可

以下是半通用形式的腿部工作(也支持带有命名节点的存档,如XML序列化):

#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;
}
#包括
#包括
#包括
#包括
#包括
命名空间boost{命名空间序列化{
模板
无效保存(存档和存档,::boost::rational const&r,未签名/*版本*/)
{
int n=r.分子(),d=r.分母();
ar&boost::序列化::生成nvp(“分子”,n);
ar&boost::序列化::生成nvp(“分母”,d);
}
模板
无效加载(归档&ar,::boost::rational&r,未签名/*版本*/)
{
int n,d;
ar&boost::序列化::生成nvp(“分子”,n);
ar&boost::序列化::生成nvp(“分母”,d);
r=::boost::rational(n,d);
}
} }
BOOST\u序列化\u剥离\u自由(BOOST::rational);
使用名称空间boost;
#包括
#包括
int main()
{
有理数(2,3),其他;
std::stringstream-ss;
{
归档文件:xml_oarchive oa(ss);

oa使用提供的输入/输出功能:

序列化为
std::string

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

  rational_ss << rational;
  return rational_ss.str();
}
模板
std::string序列化(boost::rational和rational)常量{
std::stringstream rational\u ss;

谢谢你的回答。我错过了显而易见的。很好的代码时尚。
template <typename I>
std::string serialize(boost::rational<I>& rational) const {
  std::stringstream rational_ss;

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