2009-09-23 18 views
6

मैं दो वर्गों के रूप में निम्नानुसार है:एक्सएमएल क्रमबद्धता

public class Info 
    { 
     [XmlAttribute] public string language; 
     public int version; 
     public Book book; 

     public Info() { } 

     public Info(string l, int v, string author, int quantity, int price) 
     { 
     this.language = l; 
     this.version = v; 
     book = new Book(author, quantity, price); 
     } 


    } 

    public class Book 
    { 
      [XmlAttribute] public string author; 
      public int quantity; 
      public int price; 
      [XmlIgnore]public int total; 
      public NameValueCollection nvcollection = new NameValueCollection(); 

      public Book() { } 

      public Book(string author, int quantity, int price) 
      { 
      this.author = author; 
      this.quantity = quantity; 
      this.price = price; 
      total = quantity * price; 
      nvcollection.Add(author, price.ToString()); 
      } 

    } 

मैं एक ArrayList जो जानकारी वर्ग के दो उदाहरणों के रूप में निम्नानुसार कहते हैं बनाया है:

  FileStream fs = new FileStream("SerializedInfo.XML", FileMode.Create); 

      List<Info> arrList = new List<Info>(); 

      XmlSerializer xs = new XmlSerializer(typeof(List<Info>)); 

      Info pObj = new Info("ABC", 3, "DEF", 2, 6); 

      Info pObj1 = new Info("GHI", 4, "JKL", 2, 8); 

      arrList.Add(pObj); 
      arrList.Add(pObj1); 

      xs.Serialize(fs, arrList); 

      fs.Close(); 

लेकिन जब मैं serialize करने का प्रयास करें, मुझे अपवाद मिलता है "प्रकार को प्रतिबिंबित करने में त्रुटि हुई थी" System.Collections.Generic.List`1 [ConsoleAplicationSerialization.Info] '।

क्या कोई मुझे इसके साथ मदद कर सकता है?

इसके अलावा, namevaluecollection के बजाय, मैं किस प्रकार की संरचना का उपयोग कर सकता हूं?

उत्तर

3

NameValueCollection सीधे को लागू नहीं ICollection इंटरफेस है। इसके बजाए, NameValueCollection नामऑब्जेक्ट कोलेक्शनबेस बढ़ाता है।यह ICollection इंटरफेस, और अतिभारित जोड़ें (System.String) विधि NameValueCollection कक्षा में लागू नहीं किया गया लागू करता है। आप XmlSerializer, XmlSerializer क्रमानुसार करने या एक सामान्य ICollection रूप NameValueCollection deserialize की कोशिश करता है का उपयोग है। इसलिए, यह डिफ़ॉल्ट जोड़ें (System.String) के लिए दिखता है। की अनुपस्थिति में जोड़ें (system.String) विधि, अपवाद फेंक दिया गया है।

कस्टम क्रमांकन के साथ एक कंटेनर वर्ग उपयोग करके देखें:

http://nayyeri.net/serialize-namevaluecollection

हालांकि, मैं अनिश्चित क्या आप वास्तव में प्राप्त करने के लिए कोशिश कर रहे हैं रहा हूँ। पुस्तक और मूल्य के लेखक को छोड़कर, एनवीकोलेक्शन में क्या होगा?

क्या आप इसे पुस्तक स्तर पर या ऑब्जेक्ट पदानुक्रम में उच्चतम का उपयोग करना चाहते हैं?

बजाय एक NameValueCollection का उपयोग कर के, आप एक शब्दकोश के लिए चाहते हो सकता है के रूप में यह यह क्या हो सकते हैं के संदर्भ में और अधिक लचीलापन है: http://johnwsaundersiii.spaces.live.com/blog/cns!600A2BE4A82EA0A6!699.entry

0

मैं अपने कोड भाग गया, और अंतरतम अपवाद आप प्राप्त यह है: बिल्कुल

एक्सएमएल serializable होने के लिए, प्रकार जो ICollection से इनहेरिट जोड़ें (System.String) के एक कार्यान्वयन होना आवश्यक है उनकी विरासत के स्तर पदानुक्रम। सिस्टम। चयन। विशेषीकृत.NameValueCollection जोड़ें (System.String) लागू नहीं करता है।

तो एक्सएमएल सीरिएलाइज़र को एक साधारण प्रकार के संग्रह की आवश्यकता है। मुझे लगता है कि आपका सबसे अच्छा विकल्प अपने NameValueCollection को एक कस्टम क्लास की सूची में परिवर्तित करना है जिसमें क्रमिकरण से पहले नाम और मान शामिल है।

+0

अच्छी तरह से, अगर मैं केवल पुस्तक कक्षा से NameValueCollection को दूर तो सब कुछ ठीक काम करता है। – Archie

0

अपडेटेडः ऐसा लगता है कि नामांकित वैल्यू कोलेक्शन आपकी वास्तविक समस्या है क्योंकि यह क्रमिक नहीं है। शायद आप Serializable dictionary का उपयोग कर सकते हैं।

+0

मानक क्रमिकरण के साथ संसाधित कक्षाओं के विपरीत, कक्षाओं को सीरियलज़ेबल विशेषता को XML क्रमिकरण के साथ संसाधित करने की आवश्यकता नहीं है। – Archie

+0

मेरी गलती। ऐसा लगता है कि आपको कुछ कस्टम सीरियलाइजेशन कोड –

1

आंतरिक अपवादों को देखें।

सबसे पहले आपको पुस्तक श्रेणी क्रमबद्ध करने की आवश्यकता है। के सभी स्तरों पर,

"एक्सएमएल serializable होना करने के लिए जो ICollection से इनहेरिट जोड़ें (System.String) के एक कार्यान्वयन होना आवश्यक प्रकार : दूसरी बात है कि NameValueCollection XmlSerializer के साथ धारावाहिक नहीं जा सकता क्योंकि है उनकी विरासत पदानुक्रम। सिस्टम। चयन। विशेषीकृत.NameValueCollection लागू नहीं करें (System.String)। "

यह आंतरिक अपवाद से संदेश है। कोड के इस टुकड़े के साथ

वर्क्स ठीक:

[Serializable] 
     public class Book 
     { 
      [XmlAttribute] 
      public string author; 
      public int quantity; 
      public int price; 
      [XmlIgnore] 
      public int total; 
      //public NameValueCollection nvcollection = new NameValueCollection(); 
      public Book() { } 
      public Book(string author, int quantity, int price) 
      { 
       this.author = author; 
       this.quantity = quantity; 
       this.price = price; 
       total = quantity * price; 
       //nvcollection.Add(author, price.ToString()); 
      } 
     } 
+0

का उपयोग करने की आवश्यकता होगी '[Serializable] 'विशेषता XML सीरियलाइजेशन से कोई फर्क नहीं पड़ता। –

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