Sözlüklerin Protobuf listesi

Aug 18 2020

.Proto'mda bir sözlük listesi tanımlamaya çalışıyorum

Bulduğum tüm örnekler, tek bir anahtar, değer çifti içeren bir sözlük sağlıyor:

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

message Dictionary {
   repeated Pair pairs = 1;
}

veya şunun gibi bir şey:

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

ama daha büyük bir karma tür sözlüğünü nasıl ele alabilirim?

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

İşleri daha da karmaşık hale getirmek için, karma değerler sözlüğünü tanımladıktan sonra, bu sözlüklerin bir listesi olan bir mesaj oluşturmam gerekiyor. Sanırım bu, iç içe geçmiş sözlükle başka bir tekrarlanan mesaj oluşturmak kadar kolay:

message DictList {
    repeated Dictionary dlist = 1;
}

Yanıtlar

1 dmaixner Aug 18 2020 at 17:22

Aklıma gelen birkaç fikir:

  1. Görünüşe göre değer için kullanmak mümkün olmalı (tüm değer türlerini önceden biliyorsanız) oneof(https://developers.google.com/protocol-buffers/docs/proto3#oneof). Bu sorunu çözebilir, örneğin
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;
}

Gerçi kullanamazsınız mapveya repeatediçinde olamazsınız oneof.

  1. İsteğe bağlı alanları kullanabilir ve hepsini mesaj tanımında değerler olarak tanımlayabilirsiniz. Daha sonra, gerçekte kullandığınızları ayarlayın.

  2. Sarmalayıcıları veya bilinen türleri kullanabilirsiniz, örneğin Value:https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#google.protobuf.Value

DÜZENLE

için Value, bu gibi kullanılabilir:

map<string, google.protobuf.Value> dict = 1;
  1. Kullanım struct(for_stack tarafından önerildiği gibi) burada görülebilir: Bir Python Dictinden Protobuf Yapısını nasıl yaratırsınız?