2011-03-02 11 views
8

मैं एक्सएमएल क्रमबद्धता का उपयोग कर रहा है, लेकिन अब एक रनटाइम त्रुटि मैंने पहले नहीं देखा है भर में आया था।क्यों XmlSerializer जो IEnumerable से विरासत जोड़ें (System.Object) के एक कार्यान्वयन के लिए प्रकार की आवश्यकता होती है?

"एक्सएमएल serializable होना करने के लिए है, जो IEnumerable से इनहेरिट उनकी विरासत के सभी स्तरों पदानुक्रम। ImageEditor.EffectOptions जोड़े को लागू नहीं करता है पर जोड़ें के कार्यान्वयन (System.Object) होना आवश्यक प्रकार (सिस्टम .Object) "

ऐसा लगता है एक छोटे से अजीब क्रम अपवाद के माध्यम से एक विधि को लागू करने के बजाय इस तरह लागू किया इंटरफेस से लापता तरीके के रूप में टाइम त्रुटि संकलन मजबूर हो।

क्या यह डिज़ाइन द्वारा है? क्या इसे XmlSerializable, आदि जैसे किसी प्रकार के इंटरफ़ेस के माध्यम से लागू नहीं किया जाना चाहिए?

इसके अलावा मुझे आश्चर्य है कि क्या सीरिएलाइज़र सही प्रकार के मान को पारित करने की गारंटी देता है जहां मैं इसे टाइप में डाल सकता हूं, जो मेरे मामले में EffectOption है।

या मुझे यह देखने के लिए Add (object) विधि लागू करनी चाहिए कि यह वस्तु EffectOption टाइप की गई है और यदि कोई अपवाद नहीं फेंकता है?

मैंने इस Add (object) विधि को पहले लागू नहीं किया है, लेकिन मेरा अनुमान है कि इसे EffectOption पर डालना सुरक्षित है और इसे EffectOptions संग्रह में जोड़ें।

संपादित करें:

public class EffectOptions : IEnumerable<EffectOption> 
{ 
    public List<EffectOption> Options { get; private set; } 

    //IEnumerable methods 
} 

उत्तर

3

क्योंकि उप वर्गों परोक्ष आधार वर्ग की वजह से इंटरफ़ेस तरीकों को लागू लेकिन XmlSerializer प्रतिबिंब उपयोग कर रहा है और यही वजह है कि आप क्रम में त्रुटि मिलती है और समय संकलन नहीं: यहाँ प्रकार ही है।

को लागू करने स्पष्ट की कोशिश करो और देखो क्या होता है। मुझे पहले इस मुद्दे को नहीं मिला है इसलिए मुझे यकीन नहीं है कि आप तब तक क्यों हैं जब तक कि आप कुछ कस्टम नहीं कर रहे हों।

यदि आप अपने उप वर्गों स्पष्ट रूप से अपने आधार प्रकार के कारण इंटरफेस को लागू करने, लेकिन किसी भी कार्यान्वयन कोड (तरीकों की अंतर्निहित कार्यान्वयन पर हो दे) नहीं कर रही है तो अपने उप प्रकार घोषणा से इंटरफेस को दूर के रूप में यह अभी भी मान्य होना चाहिए। (किसी ने मुझे बता सकते हैं कि मैं यहाँ बंद कर रहा हूँ)

+0

धन्यवाद, लेकिन आप उपवर्गों से क्या मतलब है? मेरा प्रकार किसी अन्य प्रकार से नहीं लिया गया है, यह केवल IENumerable लागू करता है। –

+0

क्या आप विधि स्टब्स के साथ कक्षा पोस्ट कर सकते हैं? –

+0

प्रश्न में कोड जोड़ें। –

2

मैं सिर्फ इस मुद्दे में चलाने की है और एक ऐड विधि जोड़कर इसे हल:

public class EffectOptions : IEnumerable<EffectOption> 
{ 
    public List<EffectOption> Options { get; private set; } 

    public void Add(object o){ 
     this.Options.Add(o as EffectOption); //you may want to extend the code to check that this cast can be made, 
              //and throw an appropriate error (otherwise it'll add null to your list) 
    } 

    //IEnumerable methods 
} 

मुझे आशा है कि इस मदद करता है।

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

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