我正在为一个可以包含多个值的参数列表编写通信协议模式:uint64,float64,string或bool。
如何将表字段设置为多个原始标量和非标量原始类型的并集?
我已经尝试使用这些类型的并集,但是在构建时遇到以下错误:
$ schemas/foobar.fbs:28: 0: error: type referenced but not defined
(check namespace): uint64, originally at: schemas/request.fbs:5
以下是当前状态的模式:
namespace Foobar;
enum RequestCode : uint16 { Noop, Get, Set, BulkGet, BulkSet }
union ParameterValue { uint64, float64, bool, string }
table Parameter {
name:string;
value:ParameterValue;
unit:string;
}
table Request {
code:RequestCode = Noop;
payload:[Parameter];
}
table Result {
request:Request;
success:bool = true;
payload:[Parameter];
}
我要寻找的最终结果是Request和Result表,其中包含参数列表,其中参数包含名称和值以及可选的单位。
提前谢谢!
答案后解决方案: 这就是我最后想出的,这就是Aardappel。
namespace foobar;
enum RequestCode : uint16 { Noop, Get, Set, BulkGet, BulkSet }
union ValueType { UnsignedInteger, SignedInteger, RealNumber, Boolean, Text }
table UnsignedInteger {
value:uint64 = 0;
}
table SignedInteger {
value:int64 = 0;
}
table RealNumber {
value:float64 = 0.0;
}
table Boolean {
value:bool = false;
}
table Text {
value:string (required);
}
table Parameter {
name:string (required);
valueType:ValueType;
unit:string;
}
table Request {
code:RequestCode = Noop;
payload:[Parameter];
}
table Result {
request:Request (required);
success:bool = true;
payload:[Parameter];
}
答案 0 :(得分:1)
您目前无法将标量直接放在联合中,因此您必须将标量包装在表或结构中,其中结构可能是最有效的,例如
struct UInt64 { u:uint64 }
union ParameterValue { UInt64, Float64, Bool, string }
这是因为联合必须统一地具有相同的大小,因此它只允许可以偏移的类型。
不过,通常来说,FlatBuffers是一个强类型的系统,您在此处创建的架构通过模拟动态类型的数据来消除这种情况,因为您的数据实际上是(字符串,任何类型)对的列表。最好使用针对该特定用例设计的系统,例如FlexBuffers(https://google.github.io/flatbuffers/flexbuffers.html,当前仅C ++),该系统显式地具有一个全为字符串的映射类型->任何类型对。
当然,更好的方法是不要这样通用地存储数据,而是为您拥有的每种请求和响应类型创建一个新的架构,并将参数名称设置为字段,而不是序列化的数据。到目前为止,这是最有效的,而且类型安全。