C ++ Cereal: сериализация массива в стиле C

Можно / как вы сериализуете массив, используя зерновой библиотека.

То есть

void save(Archive & ar, const unsigned int version) const
{
unsigned int l  = g1_size_bin(g,POINT_COMPRESS);
uint8_t data[l];
memset(data, 0, l);
g1_write_bin(data, l, g,POINT_COMPRESS);
ar(l);
ar(data); // what should be here
}

Это не работает (и я бы не ожидал этого тоже). И не делает

ar(cereal::binary_data(data,l));

(который, я думаю, будет работать, так как он выглядит как расширенный код, который можно использовать), что приводит к ошибке компиляции:

/usr/local/include/cereal/cereal.hpp:79:17: примечание: шаблон кандидата игнорируется: замена
ошибка: переменно измененный тип ‘unsigned char (&) [l] ‘нельзя использовать в качестве шаблона
аргумент
BinaryData binary_data (T && данные, размер size_t)

И не делает

ar.saveBinaryValue(data,l);

Так как этот метод поддерживается только для XML / Json, и я хочу двоичный архив.

4

Решение

cereal::binary_data является правильной конструкцией для использования в этом случае, при условии, что вы хотите двоичное представление массива POD. Это будет работать только для архивов, которые поддерживают binary_data (бинарный и портативный_бинарный). binary_data не работает для текстовых архивов, потому что это рассматривается как оптимизация для более общего метода сериализации — посмотрите, как vector сериализуется для примера этого.

В любом случае, вот рабочий пример сериализации массива в стиле C:

#include <cereal/archives/binary.hpp>
#include <iostream>

int main()
{
std::stringstream ss;

{
cereal::BinaryOutputArchive ar(ss);
std::uint8_t data[] = {1, 2, 3};
ar( cereal::binary_data( data, sizeof(std::uint8_t) * 3 ) );
}

{
cereal::BinaryInputArchive ar(ss);
std::uint8_t data[3];
ar( cereal::binary_data( data, sizeof(std::uint8_t) * 3 ) );

for( int i : data )
std::cout << i << " ";
}

return 0;
}

Если вы хотите сериализовать массив в стиле C в текстовый архив или если ваш массив не относится к типам POD, вам нужно будет выполнить итерацию по каждому объекту и сериализовать его по отдельности.

6

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