c++ - boost mpfr_float 的序列化

标签 c++ serialization boost mpfr multiprecision

我想序列化一个包含 boost::multiprecision::mpfr_float 作为成员的自定义类。它说here在 Boost.Serialization 文档中,类型 T 是可序列化的,前提是 5 个属性中至少有一个为真,并且 here在 Multiprecision 文档中,number 类具有直通支持,这需要底层后端是可序列化的。

对于 Boost.Multiprecision 的 mpfr_float 类型,我知道:

  1. 它不是原始类型。
  2. 它是一个类类型,但它没有定义serialize 函数。
  3. 它不是指向可序列化类型的指针。
  4. 它不是对可序列化类型的引用。
  5. 它不是可序列化类型的原生 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 函数。感谢您的帮助。

最佳答案

直通支持意味着您必须为 backend 类型添加序列化,确实如此。

您可以使用我在此答案中展示的相同方法:

我展示了如何(反)序列化 mpq_rational

关于c++ - boost mpfr_float 的序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28703639/

相关文章:

c++ - 在类中定义变量时共享指针中的递归

c++ - 编译 OpenCV 程序并且不需要安装 opencv

java - SerialVersionUid 可以是任意数字还是必须由编译器生成?

c++ - 如何强制编译 Boost 以使用 -fPIC

c++ - 如何设置对 boost::shared_array 的期望

c++ - 行数取决于用户输入

c++ - 如何减少或消除通过更改 16 位 PCM 样本的 'volume' 所产生的噪音

java - 如何调试/查看 ObjectInputStream 数据?

c++ - 我怎么知道 Cereal 的二进制输出的大小?

c++ - 获取Boost Deadline_timer native 文件描述符