2008-12-18 8 views
18

मुझे एक साधारण वर्ग मिला है जो संग्रह से विरासत में मिलता है और कुछ गुण जोड़ता है। मुझे इस कक्षा को एक्सएमएल में क्रमबद्ध करने की जरूरत है, लेकिन XMLSerializer मेरे अतिरिक्त गुणों को अनदेखा करता है।Xml एक विशेषता के साथ एक कस्टम संग्रह को क्रमबद्ध करें

मुझे लगता है कि यह विशेष उपचार के कारण है कि XMLSerializer आईसीओलेक्शन और आईनेमरेबल ऑब्जेक्ट्स देता है। इस के आसपास सबसे अच्छा तरीका क्या है?

using System.Collections.ObjectModel; 
using System.IO; 
using System.Xml.Serialization; 

namespace SerialiseCollection 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var c = new MyCollection(); 
      c.Add("Hello"); 
      c.Add("Goodbye"); 

      var serializer = new XmlSerializer(typeof(MyCollection)); 
      using (var writer = new StreamWriter("test.xml")) 
       serializer.Serialize(writer, c); 
     } 
    } 

    [XmlRoot("MyCollection")] 
    public class MyCollection : Collection<string> 
    { 
     [XmlAttribute()] 
     public string MyAttribute { get; set; } 

     public MyCollection() 
     { 
      this.MyAttribute = "SerializeThis"; 
     } 
    } 
} 

यह (ध्यान दें MyAttribute MyCollection तत्व में याद आ रही है) निम्न XML आउटपुट:

<?xml version="1.0" encoding="utf-8"?> 
<MyCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <string>Hello</string> 
    <string>Goodbye</string> 
</MyCollection> 

मैं क्या चाहता हूँ

<MyCollection MyAttribute="SerializeThis" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <string>Hello</string> 
    <string>Goodbye</string> 
</MyCollection> 
है

यहां कुछ नमूना कोड है

कोई विचार? बेहतर आसान है। धन्यवाद।

उत्तर

13

संग्रह आमतौर पर अतिरिक्त गुणों के लिए अच्छी जगह नहीं बनाते हैं। सीरियलाइजेशन और डेटा-बाध्यकारी दोनों के दौरान, यदि आइटम संग्रह (IList, IEnumerable, आदि) की तरह दिखता है तो उन्हें अनदेखा कर दिया जाएगा - परिदृश्य के आधार पर)।

तो यह मेरे था, मैं संग्रह संपुटित हैं - यानी

[Serializable] 
public class MyCollectionWrapper { 
    [XmlAttribute] 
    public string SomeProp {get;set;} // custom props etc 
    [XmlAttribute] 
    public int SomeOtherProp {get;set;} // custom props etc 
    public Collection<string> Items {get;set;} // the items 
} 

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

0

मैं उसी मुद्दे से लड़ रहा हूं रोमरू (एक वर्ग के एक्सएमएल क्रमबद्धता में गुण जोड़ना चाहता हूं जो आईसीओलेक्शन लागू करता है)। मुझे संग्रह वर्ग में मौजूद संपत्तियों का खुलासा करने का कोई तरीका नहीं मिला है। मैंने XmlAttribute टैग का उपयोग करने की कोशिश की और मेरी गुणों को रूट नोड के गुणों के रूप में दिखाया, लेकिन वहां कोई भाग्य नहीं है। हालांकि मैं "ArrayOf ..." से इसका नाम बदलने के लिए अपनी कक्षा पर XmlRoot टैग का उपयोग करने में सक्षम था। यहाँ कुछ संदर्भ मामले में आप रुचि रखते हैं कर रहे हैं:

+0

मेरा समाधान देखें, आपको यह दिलचस्प लगेगा। – toddmo

12

आप संपुटित करते हैं, मार्क Gravell पता चलता है के रूप में, इस पोस्ट की शुरुआत बताते हैं कि कैसे करने के लिए अपने एक्सएमएल को बिल्कुल वर्णन करने के लिए प्राप्त करें जैसा आप वर्णन करते हैं।

http://blogs.msdn.com/youssefm/archive/2009/06/12/customizing-the-xml-for-collections-with-xmlserializer-and-datacontractserializer.aspx

यही है, बजाय इस की:

<MyCollection MyAttribute="SerializeThis" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Items> 
    <string>Hello</string> 
    <string>Goodbye</string> 
    <Items> 
</MyCollection> 

आप इस हो सकता है:

<MyCollection MyAttribute="SerializeThis" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">  
    <string>Hello</string> 
    <string>Goodbye</string> 
</MyCollection> 
+0

@ neilwhitaker1: मैंने इस जवाब को उखाड़ फेंक दिया, लेकिन अगर आप ब्लॉग पोस्ट को पढ़ने के बजाय उत्तर में तकनीक का वर्णन करते हैं तो यह बेहतर होगा। आप अभी भी पोस्ट का संदर्भ दे सकते हैं। –

+1

ब्लॉग पोस्ट प्रश्न के उचित स्तर के साथ प्रश्न का उत्तर देता है, और ब्लॉग पोस्ट के भीतर जवाब ढूंढना आसान है। मुझे लगता है कि इस मामले में ब्लॉग से लिंक करना बेहतर है। – AndrewS

0

कभी कभी आप बस आप सिर्फ क्या करना चाहते हैं कि क्या करना चाहते हैं, फ्रेमवर्क शापित हो।

मैं एक जवाब यहाँ Property of a List<T> Not Deserialized

करता है कि ओपी करना चाहता था क्या था।

0

नील व्हिटेकर से पता चलता है और मामले में अपने लिंक मर जाता है ..

तार की दुकान और संग्रह नाम से नकाब XmlElement विशेषता लागू करें एक आंतरिक मेमोरी बनाएं। उसी एक्सएमएल आउटपुट का उत्पादन करता है जैसे कि MyCollection संग्रह से विरासत में मिला है, लेकिन मूल तत्व पर विशेषताओं को क्रमबद्ध करता है।

[XmlRoot("MyCollection")] 
public class MyCollection 
{ 
    [XmlAttribute()] 
    public string MyAttribute { get; set; } 

    [XmlElement("string")] 
    public Collection<string> unserializedCollectionName { get; set; } 

    public MyCollection() 
    { 
     this.MyAttribute = "SerializeThis"; 
     this.unserializedCollectionName = new Collection<string>(); 
     this.unserializedCollectionName.Add("Hello"); 
     this.unserializedCollectionName.Add("Goodbye"); 
    } 
} 
संबंधित मुद्दे