2011-08-02 11 views
7

मुझे व्युत्पन्न वस्तुओं की सूची वाले शब्दकोश को क्रमबद्ध करते समय समस्या हो रही है। प्रकार गैर मौजूदा होने के लिए: धारावाहिक उत्पादनxsi के बिना व्युत्पन्न वस्तुओं का सीरियलाइजेशन:

<BaseAttributes xsi:type="Turbine" Id="1975fe1f-7aa8-4f1d-b768-93ad262800cd"> 

जहाँ मैं BaseAttributes चाहते हैं टर्बाइन और xsi के साथ प्रतिस्थापित किया जा करने के लिए होता है।

<Turbine Id="1975fe1f-7aa8-4f1d-b768-93ad262800cd"> 

मेरा कोड कुल मिलाकर दिखता है। मेरे पास एक क्लास बेस एट्रिब्यूट है जिसमें से मुझे कुछ कक्षाएं मिलती हैं उदाहरण के लिए टर्बाइन क्लास। इन कक्षाओं को बेसएट्रिब्यूट्स की सूची के साथ एक शब्दकोश में संग्रहीत किया जाता है। शब्दकोश एक लागू serializable शब्दकोश है। सामान्य रूप से कोड नीचे है।

[XmlInclude(typeof(Turbine)), XmlInclude(typeof(Station)), XmlInclude(typeof(Substation))] 
public class BaseAttributes { 

    [XmlAttribute("Id")] 
    public Guid Id; 
} 



public class Turbine : BaseAttributes { 
    private Element windSpeed; 
    public Element WindSpeed { 
    get { return windSpeed; } 
    set { windSpeed = value; } 
    } 

    public Turbine(float windSpeed){ 
    this.windSpeed= new Element(windSpeed.ToString(),"ms"); 
    } 
    //used for xmlserilization 
    private Turbine(){} 
} 



public class CollectionOfBaseAttributes { 
    public SerilizableUnitsDictionary<DateTime, List<BaseAttributes>> units; 
} 

[XmlRoot("dictionary")] 
public class SerilizableUnitsDictionary<TKey, TValue> 
: Dictionary<TKey, TValue>, IXmlSerializable { 

    public System.Xml.Schema.XmlSchema GetSchema() { 
    return null; 
    } 

    public void WriteXml(System.Xml.XmlWriter writer) { 

    XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue), new XmlRootAttribute("Units")); 

    foreach (TKey key in this.Keys) { 
    writer.WriteStartElement("TimeStamp");    
    writer.WriteAttributeString("Value", key.ToString()); 

    TValue value = this[key]; 
    foreach (TValue value1 in Values) {    
     valueSerializer.Serialize(writer, value1);  
    } 

    writer.WriteEndElement(); 
    } 
} 

मैं धारावाहिकरण के लिए डेटाकंट्रैक्टर का उपयोग नहीं करता, क्योंकि मैं XML को deserializing नहीं करूँगा। मैं "बस" एक्सएमएल फाइल को विशेषताओं के साथ बनाना चाहता हूं।

मैंने XmlElementOverrides का उपयोग करने का प्रयास किया है, लेकिन शायद ऐसा कुछ है जिसे मैं उपयोग में समझता हूं। वर्तमान में मैंने इसे इस तरह उपयोग करने का प्रयास किया है:

XmlAttributes attrs = new XmlAttributes(); 
XmlElementAttribute attr = new XmlElementAttribute(); 
attr.ElementName = "Turbine"; 
attr.Type = typeof(Turbine); 
attrs.XmlElements.Add(attr); 
XmlAttributeOverrides attrOverrides = new XmlAttributeOverrides(); 
attrOverrides.Add(typeof(CollectionOfBaseAttributes), "BaseAttributes", attrs); 

XmlSerializer xmlSerializer = new XmlSerializer(typeof(CollectionOfBaseAttributes),attrOverrides); 

लेकिन इसका कोई परिणाम नहीं।

उत्तर

12

आज फिर से इसमें भाग गया और निराश हो गया तो इसका उत्तर नहीं मिला।

यदि यह एक क्षेत्र या एक संपत्ति में वस्तुओं की एक सूची है ऊपर जोड़ें:

[XmlArrayItem(Type = typeof(Turbine))] 
[XmlArrayItem(Type = typeof(Station))] 

...

यदि यह एक वस्तु जोड़ते हैं:

[XmlElement(Type = typeof(Turbine))] 
[XmlElement(Type = typeof(Station))] 
+0

धन्यवाद आदमी , इसने मेरी बहुत मदद की। यह उत्तर समाधान के रूप में स्वीकार किया जाना चाहिए। –

+0

हालांकि, दोनों व्युत्पन्न प्रकारों के लिए समान XML तत्व नाम का उपयोग करने की अनुमति नहीं है। एक समाधान है जो करता है: http://stackoverflow.com/a/1730412/3088208 – pvgoran

-1

मैंने लगभग एक ही समस्या हल की है, लेकिन आपके द्वारा पोस्ट किए गए कोड के साथ कम या कोई अंतर नहीं है।

क्या आपने गुणों को पहलुओं के रूप में रखने की कोशिश की, इसलिए व्युत्पन्न तत्व संपत्ति के शीर्ष पर? मैं इसे इस तरह से करता हूं। इसके अलावा मैंने अपनी सभी कक्षाओं में [Serializable] विशेषता भी जोड़ा।

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