2009-11-04 10 views
14

सी # में ISerializable इंटरफ़ेस को कार्यान्वित करते समय, हम एक निर्माता प्रदान करते हैं जो SerializationInfo ऑब्जेक्ट लेता है, और उसके बाद ऑब्जेक्ट के फ़ील्ड को भरने के लिए विभिन्न GetInt32, GetObject आदि विधियों के साथ पूछताछ करता है जिसे हम deserialize करने की कोशिश कर रहे हैं।SerializationInfo में TryGetValue विधियों क्यों नहीं हैं?

इस इंटरफ़ेस को लागू करने, बल्कि सिर्फ [Serializable] विशेषता का उपयोग की तुलना में, पश्च संगतता के लिए है एक प्रमुख कारण: अगर हम कुछ बिंदु पर वर्ग के लिए नई क्षेत्रों को शामिल किया है, हम SerializationException एक धारावाहिक, पुराने संस्करण द्वारा फेंका पकड़ कर सकते हैं कक्षा के, और उन्हें उचित तरीके से संभाल लें।

मेरा प्रश्न निम्न है: हमें इन अपवादों का उपयोग क्यों करना है, अनिवार्य रूप से, प्रवाह को नियंत्रित करने के लिए? यदि मैं कुछ समय पहले सहेजी गई बड़ी संख्या में कक्षाओं को बेकार कर रहा हूं, तो संभावित रूप से प्रत्येक कक्षा में प्रत्येक गायब क्षेत्र अपवाद फेंक देगा, जिससे वास्तव में खराब प्रदर्शन होगा।

SerializationInfo कक्षा TryGetValue विधियों को प्रदान नहीं करती है जो नाम स्ट्रिंग मौजूद नहीं होने पर false वापस कर देगा?

+0

पूछो जो कोई भी उस वर्ग को लागू किया गया है –

+4

अच्छी तरह से वे यहां हैं: पी –

उत्तर

23

आप उपलब्ध खाने से अधिक पुनरावृति और switch, हालांकि उपयोग कर सकते हैं ...

  foreach(SerializationEntry entry in info) { 
       switch(entry.Name) { 
        ... 
       } 
      } 

या आप इस्तेमाल कर सकते हैं Protobuf शुद्ध ;-p

+2

ठंडा; ऐसा लगता है कि यह VS2008 दस्तावेज़ में प्रलेखित नहीं है। –

+1

सहमत हुए। यह कहीं भी दस्तावेज प्रतीत नहीं होता है। ऐसा कुछ भी नहीं कहता है कि SerializationInfo गणना योग्य है। लेकिन, यह मेरे लिए काम किया। –

+1

@ माइकल को छोड़कर [यहां] (http://msdn.microsoft.com/en-us/library/system.runtime.serialization.serializationinfo.getenumerator.aspx) बेशक, या (@ जोएल) 1.1 पर वापस जा रहा है, [ यहां] (http://msdn.microsoft.com/en-us/library/system.runtime.serialization.serializationinfo.getenumerator (v = VS.71) .aspx) –

0

खैर कोई भी जवाब 'क्यों', लेकिन मैं 'm अनुमान लगा कि एमएस को संबोधित है ..

मेरे जरूरत में किसी के लिए भी कार्यान्वयन:

public static class SerializationInfoExtensions 
{ 
    public static bool TryGetValue<T>(this SerializationInfo serializationInfo, string name, out T value) 
    { 
     try 
     { 
      value = (T) serializationInfo.GetValue(name, typeof(T)); 
      return true; 
     } 
     catch (SerializationException) 
     { 
      value = default(T); 
      return false; 
     } 
    } 

    public static T GetValueOrDefault<T>(this SerializationInfo serializationInfo, string name, Lazy<T> defaultValue) 
    { 
     try 
     { 
      return (T) serializationInfo.GetValue(name, typeof(T)); 
     } 
     catch (SerializationException) 
     { 
      return defaultValue.Value; 
     } 
    } 
} 
संबंधित मुद्दे