2012-12-06 16 views
17

संभव डुप्लिकेट:
Why XML-Serializable class need a parameterless constructorक्यों मैं सी # में एक tuple serialize नहीं कर सका?

मैं अपने कोड में एक टपल क्रमानुसार करने कोशिश कर रहा हूँ:

List<List<Tuple<String, CodeExtractor.StatementNode>>> results = null; 
results = extractor.ExtractSourceCode(sourceCode); 
FileStream fs = new FileStream(@"C:\Projects\Test\ast.xml", FileMode.Create); 

XmlSerializer formatter = new XmlSerializer(
    typeof(List<List<Tuple<String, CodeExtractor.StatementNode>>>)); 

formatter.Serialize(fs, results); 

fs.Close(); 

लेकिन यह विफल रहा है और इस तरह अपवाद को पकड़ने गया था:

System.Tuple`2 [System.String, CodeExtractor.StatementNode] को क्रमबद्ध नहीं किया जा सकता है क्योंकि इसमें पैरामीटर रहित कन्स्ट्रक्टर नहीं है।

और मुझे यकीन है कि CodeExtractor.StatementNode को क्रमबद्ध किया जा सकता है।

+1

बयान इस्तेमाल कर सकते हैं: _System.Tuple '2 [System.String, System.String] को क्रमबद्ध नहीं किया जा सकता है क्योंकि इसमें पैरामीटर रहित कंस्ट्रक्टर नहीं है ... यह बहुत स्पष्ट है! (डीकंपिलेशन देखें: http://pastebin.com/b6vUMuX3) –

+0

कोडएक्स्ट्रेक्टर और स्टेटमेंट नोड दोनों क्रमिक हैं? –

+0

इस प्रश्न को देखें: http://stackoverflow.com/questions/267724/why-xml-serializable-class-need-a-parameterless-constructor – GolfWolf

उत्तर

2

जैसा कि अपवाद आपको बताता है: Tuple<T1, T2> में कोई पैरामीटर रहित कन्स्ट्रक्टर नहीं है जिसे धारावाहिक द्वारा आवश्यक है।

22

XmlSerializer के लिए अपनी नौकरी करने में सक्षम होने के लिए इसे एक डिफ़ॉल्ट नियंत्रक की आवश्यकता है। वह एक कन्स्ट्रक्टर है जो कोई तर्क नहीं लेता है। सभी ट्यूपल < ...> कक्षाओं में एक एकल कन्स्ट्रक्टर है और यह कि कन्स्ट्रक्टर कई तर्क लेता है। ट्यूपल में प्रत्येक मूल्य के लिए एक। तो अपने मामले में एकमात्र निर्माता है

Tuple(T1 value1, T2 value2) 

serializer कोई तर्क के साथ एक निर्माता की तलाश में है और क्योंकि यह नहीं मिल रहा है, तो आप अपवाद मिलता है।

आप एक परिवर्तनशील वर्ग बना सकते हैं, कि क्रमबद्धता

class MyTuple<T1, T2> 
{ 
    MyTuple() { } 

    public T1 Item1 { get; set; } 
    public T2 Item2 { get; set; } 

    public static implicit operator MyTuple<T1, T2>(Tuple<T1, T2> t) 
    { 
     return new MyTuple<T1, T2>(){ 
         Item1 = t.Item1, 
         Item2 = t.Item2 
        }; 
    } 

    public static implicit operator Tuple<T1, T2>(MyTuple<T1, T2> t) 
    { 
     return Tuple.Create(t.Item1, t.Item2); 
    } 
} 

के प्रयोजन के लिए tuples लिए प्रतिस्थापित किया जा सकता है फिर आप यह निम्नलिखित तरीके

XmlSerializer formatter = new XmlSerializer(
    typeof(List<List<MyTuple<String, CodeExtractor.StatementNode>>>)); 

formatter.Serialize(fs, results.SelectMany(
           lst => lst.Select(
             t => (MyTuple)t 
            ).ToList() 
          ).ToList()); 
संबंधित मुद्दे