【发布时间】:2015-02-24 18:37:56
【问题描述】:
我想序列化一个包含 boost::multiprecision::mpfr_float 作为成员的自定义类。它在 Boost.Serialization 文档中说 here 类型 T 是可序列化的,前提是至少 5 个属性中的一个为真,而在 Multiprecision 文档中 here 说 number 类具有传递支持,这需要底层后端可序列化。
对于 Boost.Multiprecision 的 mpfr_float 类型,我知道:
- 它不是原始类型。
- 它是一个类类型,但它没有定义
serialize函数。 - 它不是指向 Serializable 类型的指针。
- 它不是对 Serializable 类型的引用。
- 它不是 Serializable 类型的本机 C++ 数组。
所以,如果我想序列化 mpfr_float 类型,我必须为该类型提供 serialize 函数。
我的问题是:如何通过自己编写 serialize 函数来扩展 mpfr_float 类型以使其可序列化?我想我需要访问 mpfr 后端,并使用底层数据,但我不确定如何继续。非常感谢具有 Boost 序列化以前未序列化的类的经验的人的提示。
最终解决方案
根据 sehe 的回复,我得出了一个解决方案,它可以在 100 和 1000 的精度下正常往返:
namespace boost { namespace serialization { // insert this code to the appropriate namespaces
/**
Save a mpfr_float type to a boost archive.
*/
template <typename Archive>
void save(Archive& ar, ::boost::multiprecision::backends::mpfr_float_backend<0> const& r, unsigned /*version*/)
{
std::string tmp = r.str(0, std::ios::fixed);// 0 indicates use full precision
ar & tmp;
}
/**
Load a mpfr_float type from a boost archive.
*/
template <typename Archive>
void load(Archive& ar, ::boost::multiprecision::backends::mpfr_float_backend<0>& r, unsigned /*version*/)
{
std::string tmp;
ar & tmp;
r = tmp.c_str();
}
} } // re: namespaces
此解决方案解决了上述第 (2) 项的需求,这表明需要添加 serialize 函数。感谢您的帮助。
【问题讨论】:
标签: c++ serialization boost mpfr multiprecision