В выводе JSON для Cereal отсутствует закрывающая фигурная скобка

я использую Зерновые C ++ v1.1.1 и похоже на пример приведенный в документации, я пытаюсь следующее:

#include <sstream>
#include <iostream>
#include <cereal/archives/json.hpp>

int main() {
std::ostringstream os;
cereal::JSONOutputArchive archive(os);
int x = 12;
archive(CEREAL_NVP(x));
std::cout << os.str(); // JUST FOR DEMONSTRATION!
}

Я ожидаю, чтобы иметь следующее:

{
"x":12
}

но закрывающая фигурная скобка отсутствует. Есть идеи, чего не хватает в коде?

Обновить:

добавление archive.finishNode() кажется, чтобы решить проблему. Но я бы сказал, что это не решение проблемы. Согласно operator() документация, вызов оператора сериализует входные параметры, почему я должен добавить finishNode дополнительно?

4

Решение

У меня была та же проблема, и я нашел решение в комментарии к проблеме, поданной на GitHub Cereal: https://github.com/USCiLab/cereal/issues/101

В документации говорится: «Архивы предназначены для использования в RAII
и гарантированно сбрасывают их содержимое только на
разрушение … «(http://uscilab.github.io/cereal/quickstart.html).

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

Попробуй это:

int main()
{
std::stringstream ss;
{
cereal::JSONOutputArchive archive( ss );
SomeData myData;
archive( myData );
}
std::cout << ss.str() << std::endl;

return 0;
}

Пожалуйста, смотрите документацию для получения дополнительной информации.

9

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector