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 && data, size_t size)
И не делает
ar.saveBinaryValue(data,l);
Так как этот метод поддерживается только для XML/Json, и я хочу двоичный архив.
1 ответ
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, вам нужно будет выполнить итерацию по каждому объекту и сериализовать его по отдельности.