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.
Gracias hombre , Me ayudó mucho. Esta respuesta debe ser aceptada como una solución. –
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