Сериализация в статические данные с использованием Boost и IOStreams

Я пытаюсь взять сложную, вложенную структуру и сохранить ее непосредственно в файле .cpp как статические данные. Подход, который я хотел бы использовать, состоит в том, чтобы взять мой объект (который уже поддерживает сериализацию Boost) и сериализовать его как двоичный архив в байтовый массив. Затем я мог бы взять этот байтовый массив и пройти по нему, чтобы автоматически сгенерировать требуемый код .cpp для хранения двоичного массива. Затем я хотел бы десериализовать из этого байтового массива обратно в объект.

В общем, в конце дня я бы хотел что-то вроде этого:

unsigned char* my_obj = { 10, 48, 48, 30, 20 ... }

Когда я хочу использовать эти данные, я просто помещаю их в «поток байтов» и снова передаю их в Boost, чтобы десериализовать обратно в мой реальный объект.

Мой вопрос: есть ли какой-нибудь простой способ передать байтовые массивы в виде потоков? Boost имеет дело с istreams и ostreams для чтения и записи архивов. Я не хочу использовать строковый поток или файловый поток, а скорее то, что я полагаю, может быть пользовательским потоком, который просто действует как гигантский байтовый массив для всего, что ему передается.

Я чувствую, что должен быть отличный способ создать этот пользовательский поток и обеспечить его плавную работу с сериализацией Boost … Я просто не совсем уверен, с чего начать?

2

Решение

char без знака * my_obj = {10, 48, 48, 30, 20 …}

Лучше использовать:

unsigned char my_obj[] = { 10, 48, 48, 30, 20 ... }

Таким образом, у вас будет массив, который знает его размер, а не просто указатель на начало. Кроме того, добавьте const, если вы не планируете изменять его.


Мой вопрос: есть ли какой-нибудь простой способ передать байтовые массивы в виде потоков? Boost имеет дело с istreams и ostreams для чтения и записи архивов. Я не хочу использовать строковый поток или файловый поток, а скорее то, что я полагаю, может быть пользовательским потоком, который просто действует как гигантский байтовый массив для всего, что ему передается.

Проверьте Boost’s array_source и array_sink.

живое демо:

#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/iostreams/device/array.hpp>
#include <boost/iostreams/stream.hpp>
#include <iostream>
#include <ostream>
using namespace boost;
using namespace std;

struct Data
{
double value;

template<class Archive>
void serialize(Archive & ar, const unsigned int)
{
ar & value;
}
};

int main()
{
Data d={3.1415926};
char buffer[256];
{
iostreams::array_sink sink(buffer);
iostreams::stream<iostreams::array_sink> stream(sink);
archive::binary_oarchive out_archive(stream);
out_archive << d;
}
Data restored = {0.0};
{
iostreams::array_source source(buffer);
iostreams::stream<iostreams::array_source> stream(source);
archive::binary_iarchive in_archive(stream);
in_archive >> restored;
}
cout << boolalpha << ( restored.value == d.value ) << endl;
}

Выход:

true
5

Другие решения

Других решений пока нет …