Сериализация производных объектов без xsi: type - PullRequest
7 голосов
/ 02 августа 2011

У меня проблема при сериализации словаря, содержащего список производных объектов.Сериализованный вывод содержит

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

, где я хотел бы, чтобы BaseAttributes был заменен на Turbine, а тип xsi: не существовал.

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

Мой код в целом выглядит такследующие.У меня есть класс BaseAttributes, из которого я наследую некоторые классы, например, класс Turbine.Эти классы хранятся в словаре со списком базовых атрибутов.Словарь представляет собой реализованный сериализуемый словарь.Ниже приведен код в целом.

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

Но результата от этого нет.

Ответы [ 2 ]

12 голосов
/ 21 ноября 2011

Сегодня столкнулся с ним снова и был разочарован, ТАК не было ответа.

Если это список объектов в поле или свойстве, добавьте его сверху:

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

...

Если это один объект, добавьте:

 [XmlElement(Type = typeof(Turbine))]
 [XmlElement(Type = typeof(Station))]
0 голосов
/ 14 ноября 2011

Я решил почти ту же проблему, но с кодом, который вы разместили, разницы нет или нет.

Вы пытались разместить атрибуты как аспекты, так что поверх свойства производного элемента? Я делаю это таким образом. Далее я также добавил атрибут [Serializable] ко всем моим классам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...