Protobuf,嵌套地图?

Bru*_*eis 10 protocol-buffers

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

message MyMessage {
  map<string, map<string, string>> nestedMap = 1; // doesn't work
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试创建一种消息类型来表示期权链的定价信息(买入价和卖出价).对于那些不熟悉这些金融工具的人,基本上,我有一套"到期日(YYYYMMDD)".在这些到期日的每一个中,我都有一组"罢工(浮动数字;必要时可以表示为字符串,我很好)".在每次攻击中,我有2个选项,一个"put"和一个"call"(这被称为选项的"右侧").这些选项中的每一个都将包含"出价"和"询问"价格.

从概念上讲,我想有类似的东西

message OptionChain {
  // doesn't work:
  map<Expiration, map<Strike, map<Right, BidAskData>>> whatever = 1;
}
Run Code Online (Sandbox Code Playgroud)

我找到的替代方案是这样的:

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
}
Run Code Online (Sandbox Code Playgroud)

这似乎有效.但是,通过定义大量"中间"消息,这似乎也给我的系统增加了不必要的复杂性.

还有其他选择吗?

谢谢!

编辑:对于一些额外的背景:

  • 期权链通常包含不超过约6-10个不同的到期日,每个到期日通常不会包含超过几十个罢工.换句话说,我们谈论的是每个选项链最多需要几千字节的数据.

  • 我将使用它作为一个gRPC调用的返回值.随意为此建议替代设计!

jpa*_*jpa 2

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

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