Недавно я столкнулся с подобной проблемой с одним из моих классов, и после некоторого прохождения процедуры сериализации в отладчике, я думаю, я понял, что происходит.Проблема заключается в использовании временных операторов в операторах сериализации.В boost / serialization / complex.hpp функции сериализации выглядят следующим образом:
template<class Archive, class T>
inline void save(
Archive & ar,
std::complex< T > const & t,
const unsigned int /* file_version */
){
const T re = t.real();
const T im = t.imag();
ar << boost::serialization::make_nvp("real", re);
ar << boost::serialization::make_nvp("imag", im);
}
template<class Archive, class T>
inline void load(
Archive & ar,
std::complex< T >& t,
const unsigned int /* file_version */
){
T re;
T im;
ar >> boost::serialization::make_nvp("real", re);
ar >> boost::serialization::make_nvp("imag", im);
t = std::complex< T >(re,im);
}
Обратите внимание, что сериализация выполняется через временные.Функциональность get_content работает путем создания типа данных MPI, который действительно является картой расположения содержимого в памяти.При получении сообщения MPI копирует данные непосредственно в эти местоположения, не вызывая операторов сериализации.Проблема состоит в том, что когда «save» использует временные значения, get_content () не будет получать местоположения фактических данных, но временных значений, поэтому полученные данные не будут помещены в правильное место.функциональность содержимого для работы, у меня сложилось впечатление, что функция сохранения (которую вызывает get_content ()) должна напрямую и только сериализовать элементы данных объекта.В этом случае это невозможно, потому что у него нет доступа к внутреннему представлению комплекса.Я думаю, что нужно написать операторы сериализации в качестве членов класса.
(Эти ограничения вообще не упоминаются в документации Boost :: MPI.)