Elenco dei dizionari protobuf

Aug 18 2020

Sto cercando di definire un elenco di dizionari nel mio .proto

Tutti gli esempi che ho trovato forniscono un dizionario con un'unica chiave, coppia di valori:

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

message Dictionary {
   repeated Pair pairs = 1;
}

o qualcosa di simile:

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

ma come gestirei un dizionario più ampio di tipi misti?

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

Per complicare ulteriormente le cose, una volta definito il dizionario dei valori misti devo creare un messaggio che sia un elenco di questi dizionari. Presumo che sia facile come creare un altro messaggio ripetuto con il dizionario annidato:

message DictList {
    repeated Dictionary dlist = 1;
}

Risposte

1 dmaixner Aug 18 2020 at 17:22

Poche idee che mi sono venute:

  1. Sembra che dovrebbe essere possibile (se conosci tutti i tipi di valore in anticipo) da utilizzare oneofper il valore (https://developers.google.com/protocol-buffers/docs/proto3#oneof). Questo potrebbe risolvere il problema, ad es
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;
}

Non puoi usare mapo repeateddentro oneofperò.

  1. È possibile utilizzare campi facoltativi e definirli tutti come valori nella definizione del messaggio. Quindi imposta solo quelli che usi effettivamente.

  2. Potresti usare wrapper o tipi noti, ad esempio Value:https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#google.protobuf.Value

MODIFICARE

per il Value, potrebbe essere usato in questo modo:

map<string, google.protobuf.Value> dict = 1;
  1. Usa struct(come suggerito da for_stack), potrebbe essere visto qui: Come si crea un Protobuf Struct da un Python Dict?