я использую Зерновые 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
дополнительно?
У меня была та же проблема, и я нашел решение в комментарии к проблеме, поданной на 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; }
Пожалуйста, смотрите документацию для получения дополнительной информации.