Mam problem podczas serializowania Słownika zawierającego listę pochodnych obiektów. Wyjście odcinkach zawieraSerializacja obiektów pochodnych bez xsi: typ
<BaseAttributes xsi:type="Turbine" Id="1975fe1f-7aa8-4f1d-b768-93ad262800cd">
gdzie I jak BaseAttributes mogą być podstawione przez turbiny i xsi: typu, żeby nie istnieje.
<Turbine Id="1975fe1f-7aa8-4f1d-b768-93ad262800cd">
Mój kod wygląda ogólnie tak: Mam klasy BaseAttributes, z których wywodzę niektóre klasy, na przykład klasy Turbine. Te klasy są przechowywane w słowniku z listą BaseAttributes. Słownik jest zaimplementowanym serializowalnym słownikiem. Poniżej znajduje się ogólnie kod.
[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();
}
}
Nie używam DataContractor do serializacji, ponieważ nie będę deserializować XML. Chcę "po prostu" utworzyć plik XML z atrybutami.
Próbowałem użyć XmlElementOverrides, ale jest prawdopodobnie coś, co po prostu nie rozumiem w użyciu. Obecnie starałem się go używać w następujący sposób:
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);
Ale bez rezultatu.
Dzięki człowiek , bardzo mi to pomogło. Ta odpowiedź powinna zostać zaakceptowana jako rozwiązanie. –
To jednak nie pozwala na użycie tej samej nazwy elementu XML dla obu typów pochodnych. Istnieje rozwiązanie, które działa: http://stackoverflow.com/a/1730412/3088208 – pvgoran