模式查询和 JSON 数据转换
Queries on schema and JSON data conversion
我们已经在我们的软件代码中嵌入了 flatbuffer 库,用于生成具有 JSON 输出数据的简单模式。
更多更新: 我们正在使用 flatc 编译器针对模式生成头文件,并将这些文件与 FB 库一起集成到我们的代码中以进一步 serialization/deserialization。
现在我们还需要支持以下模式树。
namespace SampleNS;
/// user defined key value pairs to add custom metadata
/// key namespacing is the responsibility of the user
table KeyValue {
key:string (key, required);
value:string (required);
}
enum SchemaVersion:byte {
V1,
V2
}
table Sometable {
value1:ubyte;
value2:ushort (key);
}
table ComponentData {
inputs: [Sometable];
outputs: [Sometable];
}
table Node {
name:string (key);
/// IO definition
data:ComponentData;
/// nested child
child:[Components];
}
table Components {
type:ubyte;
index:ubyte;
nodes:[Node];
}
table GroupMasterData {
schemaversion:SchemaVersion = sampleNS::SchemaVersion::V1;
metainfo:[KeyValue];
/// List of expected components in the system
components:[Components];
}
root_type GroupMasterData;
如上所示,table Components
是递归嵌套的。目的是组件可能有具有相同字段的子组件。
我有几个问题:
- Flatc 在模式编译期间没有给我任何错误
递归嵌套 tables。但这在现场是否得到支持
访问此类 tables?
- 我试图根据上述数据生成示例 json 数据文件,但我
无法看到 schemaversion 的字段。我知道FB没有
序列化默认值。所以,我删除了我的默认值
在架构中分配。但是,它仍然没有写入 json 数据
文件。在此我还了解到我们可以强行写入文件
使用 force_defaults 选项。我不知道这是哪里
放:在属性中还是其他地方?
- 我可以创建枚举字段的结构吗?
他们是否 API 设置我们传递给编译器参数的 Flatbuffer 选项?或者如果没有,我认为我们可能必须修改 FB 库代码。请提出建议。
方法一:
在我们的序列化方法中,我们这样做:
flatbuffers::Parser* parser = new flatbuffers::Parser();
parser->opts.output_default_scalars_in_json = true;
这是正确的方法还是我应该使用其他方法API?
- 是的,完全支持树(甚至 DAG)结构。类型定义是递归的,但数据最终将具有带有空子向量的叶节点,大概。
V1
的整数值为 0
,这也是所有未指定明确默认值的字段的默认值。转换时使用--defaults-json
可以看到这个字段。请注意,模式中的显式版本是一种反模式,因为模式自然可以进化而不会破坏向后兼容性。
- 您可以将枚举字段放入结构中,是的。是这个意思吗?
我们已经在我们的软件代码中嵌入了 flatbuffer 库,用于生成具有 JSON 输出数据的简单模式。
更多更新: 我们正在使用 flatc 编译器针对模式生成头文件,并将这些文件与 FB 库一起集成到我们的代码中以进一步 serialization/deserialization。
现在我们还需要支持以下模式树。
namespace SampleNS;
/// user defined key value pairs to add custom metadata
/// key namespacing is the responsibility of the user
table KeyValue {
key:string (key, required);
value:string (required);
}
enum SchemaVersion:byte {
V1,
V2
}
table Sometable {
value1:ubyte;
value2:ushort (key);
}
table ComponentData {
inputs: [Sometable];
outputs: [Sometable];
}
table Node {
name:string (key);
/// IO definition
data:ComponentData;
/// nested child
child:[Components];
}
table Components {
type:ubyte;
index:ubyte;
nodes:[Node];
}
table GroupMasterData {
schemaversion:SchemaVersion = sampleNS::SchemaVersion::V1;
metainfo:[KeyValue];
/// List of expected components in the system
components:[Components];
}
root_type GroupMasterData;
如上所示,table Components
是递归嵌套的。目的是组件可能有具有相同字段的子组件。
我有几个问题:
- Flatc 在模式编译期间没有给我任何错误 递归嵌套 tables。但这在现场是否得到支持 访问此类 tables?
- 我试图根据上述数据生成示例 json 数据文件,但我 无法看到 schemaversion 的字段。我知道FB没有 序列化默认值。所以,我删除了我的默认值 在架构中分配。但是,它仍然没有写入 json 数据 文件。在此我还了解到我们可以强行写入文件 使用 force_defaults 选项。我不知道这是哪里 放:在属性中还是其他地方?
- 我可以创建枚举字段的结构吗?
他们是否 API 设置我们传递给编译器参数的 Flatbuffer 选项?或者如果没有,我认为我们可能必须修改 FB 库代码。请提出建议。
方法一: 在我们的序列化方法中,我们这样做:
flatbuffers::Parser* parser = new flatbuffers::Parser();
parser->opts.output_default_scalars_in_json = true;
这是正确的方法还是我应该使用其他方法API?
- 是的,完全支持树(甚至 DAG)结构。类型定义是递归的,但数据最终将具有带有空子向量的叶节点,大概。
V1
的整数值为0
,这也是所有未指定明确默认值的字段的默认值。转换时使用--defaults-json
可以看到这个字段。请注意,模式中的显式版本是一种反模式,因为模式自然可以进化而不会破坏向后兼容性。- 您可以将枚举字段放入结构中,是的。是这个意思吗?