我正在使用 Protobuf 3。从文档中,似乎无法定义嵌套映射:

message MyMessage {
  map<string, map<string, string>> nestedMap = 1; // doesn't work
}

我正在尝试创建一个消息类型来表示期权链的定价信息(买入价和卖出价)。对于那些不熟悉这些金融工具的人,基本上,我有一套“到期日(YYYYMMDD)”。在这些到期日期中的每一个中,我都有一组“罢工(浮点数;如有必要,可以表示为字符串,我可以接受)”。在每次行使中,我有 2 个选项,一个“看跌”和一个“看涨”(这称为期权的“权利”)。这些选项中的每一个都将包含一个“出价”和一个“要价”。

从概念上讲,我想要类似的东西
message OptionChain {
  // doesn't work:
  map<Expiration, map<Strike, map<Right, BidAskData>>> whatever = 1;
}

我发现的替代方案是这样的:
message OptChain {
  map<string, OptChainExpirations> expirations = 1;
}
message OptChainExpirations {
  map<string, OptChainExpirationsStrikes> strikes = 1;
}
message OptChainExpirationsStrikes {
  OptBidAsk put = 1;
  OptBidAsk call = 2;
}
message OptBidAsk {
  double bid = 1;
  double ask = 2;
  // any other fields that might be necessary in the future
}

这似乎有效。但这似乎也给我的系统增加了不必要的复杂性,因为它定义了大量的“中间”消息。

有没有其他选择?

谢谢!

编辑:对于一些额外的上下文:
  • 一个期权链通常包含不超过大约 6-10 个不同的到期日,每个到期日通常不会包含超过大约几十个行使价。换句话说,我们谈论的是对于每个期权链最多获取几千字节的数据。
  • 我将使用它作为一个 gRPC 调用的返回值。随意为此建议替代设计!
  • 最佳答案

    对我来说,你的中间消息类型的替代方案似乎很好。稍微简化命名可能是值得的,例如Strike 而不是 OptChainExpirationsStrikes 。如果您担心名称冲突,请将其全部放在自己的命名空间/包中。

    还要考虑您是要根据字符串键查找罢工,还是作为普通的重复字段会更好。

    关于protocol-buffers - Protobuf,嵌套映射?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38863661/

    10-13 06:00