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

Другие вопросы по тегам