将 FlatBuffer 对象序列化为 JSON,而不使用其架构文件

Serializing a FlatBuffer object to JSON without it's schema file

本文关键字:文件 对象 FlatBuffer 序列化 JSON      更新时间:2023-10-16

我一直在使用FlatBuffers作为我项目中各种事情的解决方案,其中之一就是JSON支持。然而,虽然FB本身支持JSON生成,但flatbuffers的文档很差,而且过程有些繁琐。现在,我正在朝着对象>JSON方向工作。我遇到的问题并没有真正以相反的方式出现(我认为(。

我目前根据我在这里找到的示例(第 630 行,JsonEnumsTest()(生成 JSON - 通过将.fbs文件解析为flattbuffers::Parser,构建和打包我的 flatbuffer 对象,然后运行GenerateText()生成 JSON 字符串。我拥有的代码比test.cpp中的示例更简单,并且隐约看起来像这样:

bool MyFBSchemaWrapper::asJson(std::string& jsonOutput)
{
//**This is the section I don't like having to do
std::string schemaFile;
if (flatbuffers::LoadFile((std::string(getenv("FBS_FILE_PATH")) + "MyFBSchema.fbs").c_str(), false, &schemaFile))
{
flatbuffers::Parser parser;
const char *includePaths[] = { getenv("FBS_FILE_PATH");
parser.Parse(schemaFile.c_str(), includePaths);
//**End bad section
parser.opts.strict_json = true;
flatbuffers::FlatBufferBuilder fbBuilder;
auto testItem1 = fbBuilder.CreateString("test1");
auto testItem2 = fbBuilder.CreateString("test2");
MyFBSchemaBuilder myBuilder(fbBuilder);
myBuilder.add_item1(testItem1);
myBuilder.add_item2(testItem2);
FinishMyFBSchemaBuffer(fbBuilder, myBuilder.finish());
auto result = GenerateText(parser, fbBuilder.GetBufferPointer(), &jsonOutput);
return true;
}
return false;
}

这是我的问题:我想避免包含.fbs文件来设置我的Parser。我不想通过添加更多的随机文件夹、目录、环境变量等来弄乱已经很大的单片程序。我希望能够从编译的 FlatBuffer 模式生成 JSON,而不必搜索文件来执行此操作。

有没有办法让我避免将.fbs模式读回解析器?我的直觉指向,但是缺乏关于FlatBuffers和JSON主题的文档和社区支持告诉我可能有一种方法。我希望有一种方法可以使用已经生成的MyFBSchema_generated.h来创建 JSON 字符串。

是的,请参阅文档中的Mini Reflection:http://google.github.io/flatbuffers/flatbuffers_guide_use_cpp.html