2013-05-05 8 views
9

प्रोटोबफ-नेट, कमाल में आया! मेरे पास खाली सूचियों के क्रमिकरण के संबंध में एक प्रश्न है।प्रोटोबफ-नेट खाली सूची

मैं वस्तु मैं क्रमानुसार करने चाहते हैं की घोषणा के द्वारा शुरू:

[ProtoContract] 
class TestClass 
{ 
    [ProtoMember(1)] 
    List<int> _listOfInts = new List<int>(); 

    public TestClass() { } 

    public List<int> ListOfInts 
    { 
     get { return _listOfInts; } 
     set { _listOfInts = value; } 
    } 
} 

तो _listOfInts खाली (लेकिन शून्य नहीं) है जब मैं deserialse इस वस्तु हमेशा अशक्त हो जाएगा। यह समझ में Protobuf सम्मेलन को देख बनाता है और मैं वर्तमान में निम्न विधि जोड़कर इस को हल करने के:

[ProtoAfterDeserialization] 
private void OnDeserialize() 
{ 
    if (_listOfInts == null) 
     _listOfInts = new List<int>(); 
} 

मेरे सवाल यह है कि मैं एक अतिरिक्त attirbute जो होगा साथ संभवतः अधिक संक्षिप्त फैशन में यह एक ही कार्यक्षमता प्राप्त कर सकते हैं, है नल की जगह खाली/खाली वस्तुओं को खाली के रूप में प्रारंभ करें?

उत्तर

5

यदि आप एक शून्य सूची के खिलाफ सुरक्षा करने की कोशिश कर रहे हैं तो आप संपत्ति गेटटर में आलसी लोडिंग का प्रयास कर सकते हैं।

public List<int> ListOfInts 
{ 
    get { return _listOfInts ?? (_listOfInts = new List<int>()); } 
    set { _listOfInts = value; } 
} 

इस तरह आप केवल धारावाहिक को शून्य वापस करने की अनुमति दे सकते हैं।

+0

यह एक संभावना है जिसे मैंने नहीं माना था, अगर मैं कर सकता तो आपको वोट दूंगा। मैं अभी भी मुख्य रूप से यह जानना चाहता हूं कि क्या कोई विशेषता है जो मेरे लिए यह करेगी। – CanCan

+0

क्या आपने [DefaultValue] विशेषता का प्रयास किया है? सुनिश्चित नहीं है कि आप सूचियां आरंभ कर सकते हैं लेकिन कोशिश करने लायक हैं। – Jras

+0

@ ज्रास मैंने इस तरह को जोड़ने पर विचार किया था, लेकिन हर बार मैंने इसे देखा है, यह वास्तव में लोगों के कोड को और भी खराब कर देता है, बेहतर नहीं –

6

प्रोटोबफ डेटा को एन्कोड करने के तरीके के संदर्भ में यहां एक मौलिक मुद्दा है: सूची में डेटा में दिखाई नहीं देता है - केवल तत्व। इस वजह से, सूची के बारे में जानकारी स्टोर करने के लिए कहीं भी स्पष्ट नहीं है। इसे सशर्त क्रमिकरण का उपयोग करके एक बूलियन भेजकर धोखा दिया जा सकता है, लेकिन स्पष्ट रूप से यह थोड़ा हैकी और बदसूरत है - और जटिलता जोड़ता है। निजी तौर पर, मैं दृढ़ता से उन सूचियों से दूर सारणी की सलाह देता हूं जो कभी भी शून्य हो सकती हैं। उदाहरण के लिए:

private readonly List<Foo> items = new List<Foo>(); 
[ProtoMember(1)] 
public List<Foo> Items { get { return items; } } 

या

private List<Foo> items; 
[ProtoMember(1)] 
public List<Foo> Items { get { return items ?? (items = new List<Foo>()); } } 

और ध्यान दें कि यह सलाह सिर्फ क्रमबद्धता के बारे में नहीं है: यह मनमाने ढंग से अशक्त-संदर्भ-अपवाद बचने के बारे में है। आम तौर पर लोग उप-संग्रह की अपेक्षा नहीं करते हैं।

+0

क्या कोई कारण है कि आप निजी आइटम फ़ील्ड पर संग्रह शुरू नहीं करते हैं? मैं देख सकता हूं कि यदि आपने आइटम प्रॉपर्टी के गेटटर तक नहीं पहुंचा है तो आप खाली संग्रह संदर्भ पर लटक नहीं रहे हैं, लेकिन आप हर बार एक नल चेक की कीमत चुका रहे हैं। क्या यह सिर्फ परिस्थिति है? – Shaun

संबंधित मुद्दे