Protobuf daftar kamus

Aug 18 2020

Saya mencoba mendefinisikan daftar kamus di .proto saya

Semua contoh yang saya temukan menyediakan kamus dengan satu kunci, pasangan nilai:

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

message Dictionary {
   repeated Pair pairs = 1;
}

atau sesuatu seperti:

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

tapi bagaimana saya menangani kamus yang lebih besar dari jenis campuran?

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

Untuk lebih memperumit masalah, setelah saya mendefinisikan kamus nilai campuran, saya perlu membuat pesan yang merupakan daftar kamus ini. Saya berasumsi itu semudah membuat pesan berulang lainnya dengan kamus bersarang:

message DictList {
    repeated Dictionary dlist = 1;
}

Jawaban

1 dmaixner Aug 18 2020 at 17:22

Beberapa ide yang saya dapatkan:

  1. Tampaknya itu memungkinkan (jika Anda mengetahui semua jenis nilai dimuka) untuk digunakan oneofuntuk nilai (https://developers.google.com/protocol-buffers/docs/proto3#oneof). Itu bisa menyelesaikan masalah, mis
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;
}

Anda tidak dapat menggunakan mapatau repeateddi dalam oneofsekalipun.

  1. Anda dapat menggunakan kolom opsional dan menentukan semuanya sebagai nilai dalam definisi pesan. Kemudian atur hanya itu, yang benar-benar Anda gunakan.

  2. Anda bisa menggunakan pembungkus, atau jenis yang dikenal, misalnya Value:https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#google.protobuf.Value

EDIT

untuk Valueitu, bisa digunakan seperti ini:

map<string, google.protobuf.Value> dict = 1;
  1. Gunakan struct(seperti yang disarankan oleh for_stack), bisa dilihat di sini: Bagaimana Anda membuat Protobuf Struct dari Python Dict?