2011-08-02 34 views
7

Tengo un problema al serializar un diccionario que contiene una lista de objetos derivados. La salida en serie contieneSerialización de objetos derivados sin xsi: tipo

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

donde me gustaría los BaseAttributes ser sustituido con turbina y el xsi: type para ser no-existente.

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

Mi código en general es similar al siguiente. Tengo una clase BaseAttributes de la cual derivo algunas clases, por ejemplo, la clase Turbine. Estas clases se almacenan en un diccionario con una lista de atributos base. El diccionario es un diccionario serializable implementado. A continuación está el código en general.

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

que no utiliza un DataContractor para la serialización, como no voy a deserializar el XML. Yo "solo" quiero crear el archivo XML con atributos.

He intentado utilizar las XmlElementOverrides, pero es probable que haya algo que simplemente don' entendido en el uso. Actualmente he intentado usarlo así:

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); 

Pero no hay ningún resultado de eso.

Respuesta

12

Volvió a entrar hoy y estaba decepcionado SO no tenía la respuesta.

Si se trata de una lista de objetos en un campo o una propiedad Agregar esta en la parte superior:

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

...

Si es un complemento único objeto:

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

Gracias hombre , Me ayudó mucho. Esta respuesta debe ser aceptada como una solución. –

+0

Sin embargo, esto no permite usar el mismo nombre de elemento XML para ambos tipos derivados. Hay una solución que hace: http://stackoverflow.com/a/1730412/3088208 – pvgoran

-1

He resuelto casi el mismo problema, pero hay menos o ninguna diferencia con el código que ha publicado.

Did se trató de colocar los atributos como los aspectos, por lo que en la parte superior de la propiedad elemento derivado? Lo hago de esa manera. Además, también agregué el atributo [Serializable] a todas mis clases.

Cuestiones relacionadas