Да, вы, безусловно, можете использовать его в некотором смысле. Oarchive просто оборачивает поток и не знает, что происходит с данными потока, поэтому хитрость заключается в том, чтобы реализовать свой собственный поток (что не весело), чтобы позволить вам «сбросить» фактический лежащий в основе поток данных. Я уже писал что-то подобное, и это прекрасно работает.
Некоторые ошибки, о которых следует знать:
Oarchive не будет продолжать записывать информацию заголовка (поскольку, если он сохраняется, он обрабатывает все как один большой поток), поэтому вы захотите отключить заголовки:
boost::archive::binary_oarchive oa(s, boost::archive::no_codecvt | boost::archive::no_header);
Кроме того, поскольку вы повторно используете oarchive, вы должны быть чрезвычайно осторожны при управлении его внутренней таблицей типов. Если все, что вы сериализуете - это целые числа, числа с плавающей запятой и т. Д., То все будет в порядке, но как только вы начнете сериализовать классы, строки и тому подобное, вы не сможете полагаться на перечисление типов по умолчанию, которое архив использует при повторном использовании. архив такой. Документация Boost на самом деле не касается этого, но для чего-то сложного вам нужно сделать следующее для каждого типа, с которым столкнется архив:
oa.template register_type<std::string>();
oa.template register_type<MyClass>();
oa.template register_type<std::shared_ptr<MyClass> >();
И так далее ... для всех ваших типов, всех их std :: vectors, всех их std :: shared_ptrs и т. Д. Это vital . В противном случае вы сможете читать потоки только в том случае, если вы используете общий архив и читаете их в том же порядке, в котором они были сериализованы.
Следствием этого является то, что вашему iarchive необходимо регистрировать все типы точно таким же образом и в том же порядке, что и их архив (я написал несколько удобных помощников, использующих mpl, чтобы помочь мне в этом).
Сериализация обратно через iarchive также может использовать тот же самый iarchive, однако применяются все те же условия:
- Вам нужно написать собственный поток (чтобы его можно было перенаправить / сбросить)
- Отключить архив заголовков
- Есть регистр типов
Так что да, повторное использование архива / архива возможно, но это немного болезненно. Как только вы разберетесь с этим, это будет круто.