【问题标题】:Flatbuffers: How to allow multiple types for a single fieldFlatbuffers:如何允许单个字段使用多种类型
【发布时间】:2019-01-31 02:28:03
【问题描述】:

我正在为可以是多个值的参数列表编写通信协议架构: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];
}

我正在寻找的最终结果是包含参数列表的请求和结果表,其中参数包含名称和值,以及可选的单位。

提前谢谢!

回答后解决方案: 这是我最后想出的,感谢 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];
}

【问题讨论】:

    标签: schema flatbuffers


    【解决方案1】:

    您目前不能将标量直接放在联合中,因此您必须将它们包装在表或结构中,其中结构可能是最有效的,例如

    struct UInt64 { u:uint64 }
    union ParameterValue { UInt64, Float64, Bool, string }
    

    这是因为联合必须一致地具有相同的大小,因此它只允许您可以拥有偏移量的类型。

    一般来说,FlatBuffers 是一个强类型系统,而您在此处创建的架构通过模拟动态类型数据来消除这一点,因为您的数据本质上是(字符串,任何类型)对的列表。使用专为这个特定用例设计的系统可能会更好,例如 FlexBuffers(https://google.github.io/flatbuffers/flexbuffers.html,目前只有 C++),它显式地具有一个全为字符串 -> 任何类型对的映射类型。

    当然,更好的是不要如此通用地存储数据,而是为您拥有的每种类型的请求和响应创建一个新架构,并将参数名称放入字段中,而不是序列化数据。这是迄今为止最有效且类型安全的。

    【讨论】:

    • 感谢 Aardappel 的信息,我最终想到了一个替代解决方案(联合向量),这也不是很好,因为我们需要 C++ 以外的其他语言。我终于像你提到的那样为每种类型使用了单独的表格。谢谢
    • 显然,联合只能是某些语言的表,因此,我不能建立结构的联合。我仍然能够将这些结构制作成表格并将它们联合起来。
    猜你喜欢
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 2016-03-11
    相关资源
    最近更新 更多