Установка свойства, к которому я могу получить доступ в функциях сериализации при использовании библиотеки сериализации Cereal - PullRequest
0 голосов
/ 31 мая 2018

Я использую библиотеку сериализации 'Cereal' (uscilab.github.io/cereal/) для сериализации объектов, которые могут иметь миллионы чисел, и метаданных, которые описывают числа.В некоторых случаях мне не нужно сериализовать числа, только метаданные;в других случаях я хотел бы, чтобы оба в архиве.

Единственный способ, которого я мог достичь, - это добавить логическое свойство в класс OutputArchive, определенный в файле cereal.hpp.Я думаю, что когда я создаю архив, я устанавливаю это значение.Затем, когда выполняется код сериализации, любой объект может получить доступ к этому свойству и сериализовать соответствующие значения.Большинство объектов игнорируют это свойство, но объекты, содержащие (потенциально) миллионы чисел, могут либо игнорировать числа, либо нет, в зависимости от значения этого свойства.

Вот некоторый псевдокод, который поможет объяснить (полученный изпримеры на веб-сайте Cereal).Создание архива будет выглядеть так:

int main()
{
  std::stringstream ss;

  {
    cereal::BinaryOutputArchive oarchive(ss, true); // I modified the constructor to accept a boolean parameter, and set the property
    ...
  }
...

Затем, внутри функции, которая сериализует мой объект данных (объект, который содержит метаданные и миллионы чисел):

template<class Archive>
void save(Archive& ar) const
{
    ar(metadata);
    ar(more_meta_data);

    boolean bArchiveEverything = ar.ArchiveNumbers(); //<<-- this is what I don't know how to accomplish

    ar(bArchiveEverything); // put this into the archive, so I know what to expect when deserializing
    if (bArchiveEverything) {
        ar(bigVectorOfNumbers);
    }
}

Myвопросы:

1) Я все делаю неправильно?Есть ли более простой и элегантный способ, которого я пропускаю?

2) Если нет, и это кажется разумным, я не уверен, как я могу получить доступ к своему свойству в OutputArchive через параметр 'Archive &', который получаетпередал в шаблон функции, которые нужны Cereal для сериализации.

Заранее благодарим за любую помощь.

1 Ответ

0 голосов
/ 01 июня 2018

Я до сих пор не знаю, был ли это лучший способ, поэтому я не могу ответить на свой первый вопрос.

Однако получить доступ к собственности не так уж сложно.Оказывается, что, пока все классы, которые передаются в функцию «save» как «ar», имеют одну и ту же функцию, я могу использовать эту функцию точно так же, как моя функция псевдокода «ArchiveNumbers ()».Итак, все, что мне нужно было сделать, это добавить эту функцию в класс «OutputArchive» в Cereal и заставить его вернуть мое свойство.

Я не думал, что это даже скомпилируется, но я ошибался в этом.Я все еще пытаюсь обернуть голову вокруг программирования шаблона.Хотя я заставил это работать, я, конечно, не могу сказать, что это «лучшая практика».

...