शब्दकोशों की प्रोटोबॉफ़ सूची

Aug 18 2020

मैं अपने .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 dmaixner Aug 18 2020 at 17:22

कुछ विचार जिनके साथ मैं आया था:

  1. ऐसा लगता है कि यह संभव हो जाना चाहिए (यदि आप सभी मूल्य प्रकार अग्रिम जानते हैं) का उपयोग करने के oneofमूल्य के लिए (https://developers.google.com/protocol-buffers/docs/proto3#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;
}

आप हालांकि का उपयोग mapया repeatedअंदर नहीं कर सकते oneof

  1. आप वैकल्पिक फ़ील्ड का उपयोग कर सकते हैं और उन सभी को संदेश परिभाषा में मान के रूप में परिभाषित कर सकते हैं। फिर केवल उन लोगों को सेट करें, जो आप वास्तव में उपयोग करते हैं।

  2. आप रैपर या ज्ञात प्रकारों का उपयोग कर सकते हैं, जैसे Value:https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#google.protobuf.Value

संपादित करें

इसके लिए Value, इसका उपयोग इस तरह किया जा सकता है:

map<string, google.protobuf.Value> dict = 1;
  1. उपयोग struct(for_stack द्वारा सुझाए गए अनुसार), यहां देखा जा सकता है: आप पायथन डिक्ट से प्रोटोबॉफ़ संरचना कैसे बनाते हैं?