2011-08-02 12 views
7

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.

Odpowiedz

12

Wpadłem dziś jeszcze raz i byłem rozczarowany, więc nie było odpowiedzi.

Jeśli jest to lista obiektów w polu lub mienia dodać to na górze:

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

...

Jeśli jest to pojedynczy obiekt add:

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

Dzięki człowiek , bardzo mi to pomogło. Ta odpowiedź powinna zostać zaakceptowana jako rozwiązanie. –

+0

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

-1

Rozwiązałem prawie ten sam problem, ale z zamieszczonym przez ciebie kodem jest mniejsza lub żadna różnica.

Czy próbowałeś umieścić atrybuty jako aspekty, a więc na wierzchu właściwości elementu pochodnego? Robię to w ten sposób. Ponadto dodałem atrybut [Serializable] do wszystkich moich klas.

Powiązane problemy