2012-08-09 23 views
66

ज्ञात नहीं हैं। मुझे .NET के XmlSerializer के साथ काम करते समय एक बहुत ही अजीब समस्या है। ,XmlInclude या SoapInclude विशेषता का उपयोग उन प्रकारों को निर्दिष्ट करने के लिए करें जो स्थिर रूप से

public class Order 
{ 
    public PaymentCollection Payments { get; set; } 

    //everything else is serializable (including other collections of non-abstract types) 
} 

public class PaymentCollection : Collection<Payment> 
{ 
} 

public abstract class Payment 
{ 
    //abstract methods 
} 

public class BankPayment : Payment 
{ 
    //method implementations 
} 

AFAIK वहाँ InvalidOperationException कि serializer Payment के व्युत्पन्न प्रकार के बारे में जानते हुए भी नहीं के कारण होती है हल करने के लिए तीन अलग-अलग तरीके हैं:

निम्न उदाहरण कक्षाएं ले लो।

1. Payment वर्ग परिभाषा के XmlInclude जोड़ना:

यह संभव नहीं है की वजह से सभी वर्गों जिस पर मैं का कोई नियंत्रण नहीं बाहरी संदर्भ के रूप में शामिल किया जा रहा।

2. XmlSerializer उदाहरण

काम नहीं करता के निर्माण के दौरान ली गई प्रकार 'प्रकार पासिंग।

3. गुण का डिफ़ॉल्ट क्रमबद्धता ओवरराइड करने के लिए में लक्ष्य संपत्ति के लिए परिभाषित XmlAttributeOverrides (के रूप में this SO post में समझाया गया है)

भी काम नहीं करता है (XmlAttributeOverrides प्रारंभ इस प्रकार है)।

Type bankPayment = typeof(BankPayment); 

XmlAttributes attributes = new XmlAttributes(); 
attributes.XmlElements.Add(new XmlElementAttribute(bankPayment.Name, bankPayment)); 

XmlAttributeOverrides overrides = new XmlAttributeOverrides(); 
overrides.Add(typeof(Order), "Payments", attributes); 

उपयुक्त XmlSerializer कन्स्ट्रक्टर का उपयोग किया जाएगा।

नोट: से काम नहीं करता है मेरा मतलब है InvalidOperationException (BankPayment की उम्मीद नहीं कर रहा था ...) फेंक दिया है।

क्या कोई इस विषय पर कुछ प्रकाश डाल सकता है? इस मुद्दे को आगे कैसे और डीबग किया जाएगा?

उत्तर

29

बस इस मुद्दे को हल किया। थोड़ी देर के लिए चारों ओर खुदाई करने के बाद, मुझे this SO post मिला जो सटीक स्थिति को कवर करता है। यह मुझे सही रास्ते में मिला।

असल में, XmlSerializer को डिफ़ॉल्ट नामस्थान पता होना चाहिए यदि व्युत्पन्न कक्षाएं अतिरिक्त प्रकार के रूप में शामिल हैं। ऐसा होने का सटीक कारण अभी भी अज्ञात है, लेकिन फिर भी, क्रमबद्धता अब काम कर रही है।

63

यह मेरे लिए काम किया:

[XmlInclude(typeof(BankPayment))] 
[Serializable] 
public Payment { }  

[Serializable] 
public class BankPayment : Payment {} 

[Serializable] 
public class Payments : List<Payment>{} 

XmlSerializer serializer = new XmlSerializer(typeof(Payments), new Type[]{typeof(Payment)}); 
+5

तो आधार प्रकार इसके कार्यान्वयन की सभी जानते हैं की जरूरत है? यह एक बहुत अच्छा समाधान की तरह प्रतीत नहीं होता है। क्या कोई दूसरा रास्ता नहीं है? –

+1

@AlexanderStolz XmlSerializable ऑब्जेक्ट बनाने के दौरान नए प्रकार से गुजरने वाले सामान्य कार्यान्वयन के लिए सबसे अच्छा समाधान है। जैसा कि http://stackoverflow.com/a/2689660/698127 बताया गया है – Aamol