Я хочу сохранить пример ниже на жестком диске в виде простого двоичного файла. Но вокруг сети я не нашел простого и чистого примера, как это сделать, поэтому я задаю вопрос:Хранить boost :: serialization :: serialize'ble struct как двоичный файл на жесткий диск
Как изменить код ниже, чтобы сохранить структуру как двоичный файл в двоичном файле?
#include <vector>
#include <string>
#include <bitset>
#include <boost/serialization/string.hpp>
#include <boost/serialization/vector.hpp>
#include <boost/serialization/bitset.hpp>
template<size_t N>
struct Example
{
std::string id;
std::vector<std::bitset<N>> bits;
};
template<size_t N>
Example<N> make_example()
{
Example<N> example;
example.id = "some id";
example.bits.resize(100);
}
namespace boost
{
namespace serialization
{
template<typename Archive, size_t N>
void serialize (Archive & a
, Example<N> & e
, const unsigned int version)
{
a & e.id;
a & e.bits;
}
}
}
int main()
{
auto example = make_example<256>();
std::ofstream ofs("filename", std::ios::binary);
boost::archive::binary_oarchive oa(ofs);
oa << example; // shouldn't use << as oa writes a text archive
}
Действительно, у меня были некоторые ошибки копирования/вставки в моем предыдущем сообщении. Я отредактировал так, как вы предложили.Когда я запускаю программу, genereated file _filename_ показывает текстовое содержимое, подобное этому (~ 25600 символов, как ожидалось): '^ @^D^H^D^H^A^@^@^@^@^@^@^@^@^G^@^@^@^@^@^@^@ некоторые id^@^@^@^@^@ d^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^A^@^@^@^@^@^@ 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000^@^A^@^@^@^@^@^@ 0' – user1587451
Итак, это работает, но все же это не ожидаемый результат. Размер файла составляет около 26K, но 256 * 100bit = 3200 байт = 3,125K. Размер файла ~ 8 раз больше, как ожидалось. – user1587451
@ user1587451 действительно, но это двоичный архив. Перейдите в text_oarchive и включите соответствующий заголовок, чтобы увидеть разницу. Разница будет незначительной для вашего случая из-за битов, но с текстовым архивом будет больше текстовых метаданных. – aichao