序列化包含派生对象列表的Dictionary时遇到问题。序列化输出包含
<BaseAttributes xsi:type="Turbine" Id="1975fe1f-7aa8-4f1d-b768-93ad262800cd">
我希望将BaseAttributes替换为Turbine,并将xsi:type替换为不存在。
<Turbine Id="1975fe1f-7aa8-4f1d-b768-93ad262800cd">
我的整体代码如下所示。我有一个类BaseAttributes,我从中派生出一些类,例如Turbine类。这些类存储在带有BaseAttributes列表的字典中。字典是实现的可序列化字典。以下是一般的代码。
[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);
但没有结果。
答案 0 :(得分:12)
今天再次进入它并且失望所以没有答案。
如果它是字段或属性中的对象列表,请将其添加到顶部:
[XmlArrayItem(Type = typeof(Turbine))]
[XmlArrayItem(Type = typeof(Station))]
...
如果是单个对象,请添加:
[XmlElement(Type = typeof(Turbine))]
[XmlElement(Type = typeof(Station))]
答案 1 :(得分:-1)
我已经解决了几乎相同的问题,但与您发布的代码相比差别很小或没有差异。
您是否尝试将属性作为方面放置,因此在派生元素属性之上?我是这样做的。此外,我还将[Serializable]
属性添加到我的所有类中。