Protobuf词典列表

问题描述

我正在尝试在.proto中定义词典列表

我发现的所有示例都提供了带有单个键,值对的字典:

message Pair {
   string key = 1;
   string value = 2;
}

message Dictionary {
   repeated Pair pairs = 1;
}

或类似的东西

message Dictionary {
    message Pair {
        map<string,string> values = 1;
    }
    repeated Pair pairs = 1;
}

但是我将如何处理更大的混合类型字典?

{
'k1': 1,'k2': 2,'k3': 'three','k4': [1,2,3]
}

为了进一步使事情复杂化,一旦定义了混合值字典,我需要创建一条消息,这些消息是这些词典的列表。我认为这和创建另一个嵌套了字典的重复消息一样容易:

message DictList {
    repeated Dictionary dlist = 1;
}

解决方法

我想到的一些想法:

  1. (如果您预先知道所有值类型)似乎可以使用HttpContext.SignInAsync作为值(https://developers.google.com/protocol-buffers/docs/proto3#oneof)。这样可以解决问题,例如
oneof

虽然您不能在message Value { oneof oneof_values { string svalue = 1; int ivalue = 2; ... } } message Pair { string key = 1; Value value = 2; } message Dictionary { repeated Pair pairs = 1; } 内使用maprepeated

  1. 您可以使用可选字段并将它们全部定义为消息定义中的值。然后仅设置您实际使用的那些。

  2. 您可以使用包装器或已知类型,例如oneofhttps://developers.google.com/protocol-buffers/docs/reference/google.protobuf#google.protobuf.Value

编辑

对于Value,可以这样使用:

Value
  1. 使用map<string,google.protobuf.Value> dict = 1; (如for_stack所建议),可以在此处看到:How do you create a Protobuf Struct from a Python Dict?

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...