Lista de diccionarios protobuf
Estoy tratando de definir una lista de diccionarios en mi .proto
Todos los ejemplos que he encontrado proporcionan un diccionario con una única clave, par de valores:
message Pair {
string key = 1;
string value = 2;
}
message Dictionary {
repeated Pair pairs = 1;
}
o algo como:
message Dictionary {
message Pair {
map<string, string> values = 1;
}
repeated Pair pairs = 1;
}
pero ¿cómo manejaría un diccionario más grande de tipos mixtos?
{
'k1': 1,
'k2': 2,
'k3': 'three',
'k4': [1,2,3]
}
Para complicar aún más las cosas, una vez que haya definido el diccionario de valores mixtos, necesito crear un mensaje que sea una lista de estos diccionarios. Supongo que es tan fácil como crear otro mensaje repetido con el diccionario anidado:
message DictList {
repeated Dictionary dlist = 1;
}
Respuestas
Algunas ideas que se me ocurrieron:
- Parece que debería ser posible (si conoce todos los tipos de valor por adelantado) usar
oneof
para obtener valor (https://developers.google.com/protocol-buffers/docs/proto3#oneof). Eso podría resolver el problema, por ejemplo
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;
}
Sin embargo, no se puede usar map
ni repeated
dentro de él oneof
.
Puede utilizar campos opcionales y definirlos todos como valores en la definición del mensaje. Luego, configure solo los que realmente usa.
Puede usar envoltorios o tipos conocidos, por ejemplo
Value
:https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#google.protobuf.Value
EDITAR
para el Value
, podría usarse así:
map<string, google.protobuf.Value> dict = 1;
- El uso
struct
(como sugiere for_stack), se puede ver aquí: ¿Cómo se crea una estructura Protobuf a partir de un Python Dict?