Я хотел бы сериализовать пользовательский класс, содержащий boost::multiprecision::mpfr_float в качестве члена. Он говорит здесь в документации Boost.Serialization что тип T
является сериализуемым, если и только если хотя бы одно из 5 свойств истинно, и здесь в документации Multiprecision, что класс number
имеет сквозную поддержку, которая требует сериализуемости базового бэкенда.
Для типа Boost.Multiprecision mpfr_float
я знаю:
- Это не примитивный тип.
- Это тип класса, но для него не определены функции
serialize
. - Это не указатель на Serializable тип.
- Это не ссылка на сериализуемый тип.
- Это не собственный массив C++ типа Serializable.
Итак, похоже, что если я хочу сериализовать тип mpfr_float, я должен предоставить функцию serialize
для этого типа.
Мой вопрос таков: как я могу расширить тип mpfr_float
для сериализации, самостоятельно написав функцию serialize
? Я думаю, что мне нужно получить доступ к серверной части 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
. Спасибо за помощь.