序列化包含派生對象列表的字典時出現問題。串行化的輸出包含不帶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);
但是沒有結果。
感謝的人, 這對我幫助很大。這個答案應該被接受爲解決方案。 –
雖然這不允許爲兩種派生類型使用相同的XML元素名稱。有一個解決方案:http://stackoverflow.com/a/1730412/3088208 – pvgoran