Protocol buffers Protobuf,嵌套地图?

Protocol buffers Protobuf,嵌套地图?,protocol-buffers,Protocol Buffers,我用的是Protobuf3。从文档来看,似乎无法定义嵌套映射: message MyMessage { map<string, map<string, string>> nestedMap = 1; // doesn't work } messagemymessage{ 映射nestedMap=1;//不起作用 } 我试图创建一个消息类型来表示期权链的定价信息(出价和要价)。对于那些不熟悉这些金融工具的人,基本上我有一套“到期日期(YYYYMMDD)”。在每个过期

我用的是Protobuf3。从文档来看,似乎无法定义嵌套映射:

message MyMessage {
  map<string, map<string, string>> nestedMap = 1; // doesn't work
}
messagemymessage{
映射nestedMap=1;//不起作用
}
我试图创建一个消息类型来表示期权链的定价信息(出价和要价)。对于那些不熟悉这些金融工具的人,基本上我有一套“到期日期(YYYYMMDD)”。在每个过期日期中,我都有一组“罢工(浮点数;如果必要,可以表示为字符串,我同意)”。在每次行使中,我有两个期权,一个“看跌期权”和一个“看涨期权”(这被称为期权的“权利”)。每个选项都包含一个“出价”和一个“要价”

从概念上讲,我想要

message OptionChain {
  // doesn't work:
  map<Expiration, map<Strike, map<Right, BidAskData>>> whatever = 1;
}
消息选项链{
//不起作用:
map 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
}
messageoptchain{
map到期时间=1;
}
消息OptChainexPrivations{
地图走向=1;
}
消息OptChainNextriversionStrokes{
OptBidAsk put=1;
OptBidAsk呼叫=2;
}
消息OptBidAsk{
双标=1;
双ask=2;
//将来可能需要的任何其他字段
}
这似乎奏效了。但这似乎也给我的系统增加了不必要的复杂性,因为它定义了大量的“中间”消息

还有其他选择吗

谢谢

编辑:对于一些额外的上下文:

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

  • 我将使用它作为一次gRPC调用的返回值。请随意为这一点提出替代设计建议


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

也要考虑你是否会根据字符串键查找攻击,或者如果它作为一个普通重复字段更好。