Можно / как вы сериализуете массив, используя зерновой библиотека.
То есть
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, и я хочу двоичный архив.
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, вам нужно будет выполнить итерацию по каждому объекту и сериализовать его по отдельности.