2011-08-02 64 views
7

序列化包含派生對象列表的字典時出現問題。串行化的輸出包含不帶xsi的派生對象的序列化類型

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

其中我想BaseAttributes與汽輪機,將xsi取代:類型是不存在的。

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

我的代碼總體看起來像下面這樣。我有一個BaseAttributes類,我從中派生了一些類,例如Turbine類。這些類存儲在一個帶有BaseAttributes List的字典中。該字典是一個實現的可串行化字典。以下是一般的代碼。

[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(); 
    } 
} 

我不使用DataContractor進行序列化,因爲我不會反序列化XML。我「只是」想要創建具有屬性的XML文件。

我試過使用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]屬性。

相關問題