Я использую библиотеку сериализации '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 для сериализации.
Заранее благодарим за любую помощь.