Могу я сказать Boost.MPI, какую версию класса использовать с Boost.Serialization? - PullRequest
3 голосов
/ 15 апреля 2011

Я использую Boost.MPI для обмена сообщениями между процессами.Каждое сообщение содержит один из моих классов, сериализованный с использованием Boost.Serialization.Я также использую тот же код сериализации, чтобы сохранить этот класс в файл.То, что мне нужно отправить через MPI, меньше, чем то, что мне нужно сохранить в файл (меньше соответствующих членов).Я думал, что было бы неплохо использовать управление версиями класса, поддерживаемое библиотекой Serialization, чтобы сказать Boost.MPI отправлять версию класса не по умолчанию, но я не могу найти способ сделать это.Вы знаете, возможно ли это?

1 Ответ

2 голосов
/ 16 апреля 2011

Невозможно сериализовать две разные версии одного и того же типа в одном и том же двоичном модуле.Причина в том, что используемая версия является константой времени компиляции, заданной с помощью конструкции BOOST_CLASS_VERSION (номер версии по умолчанию равен нулю, если не указан).

Можно попробовать реализовать специализации функции-члена сериализациидля вашего типа для определенных типов архивов:

// generic overload, used for everything except the MPI archives
template <class Archive>
void serialize(Archive & ar, const unsigned int version)
{
    // do 'normal' (file-based) serialization
}

// overload for MPI archive used while deserialization
void serialize(boost::mpi::packed_iarchive& ar, const unsigned int version)
{
    // do MPI deserialization
}

// overload for MPI archive used while serialization
void serialize(boost::mpi::packed_oarchive& ar, const unsigned int version)
{
    // do MPI serialization
}

Точно так же вы могли бы обеспечить перегрузки при использовании функций сериализации разделенной загрузки / сохранения.

...