gpt4 book ai didi

c# - 没有 xsi :type 的派生对象的序列化

转载 作者:太空狗 更新时间:2023-10-29 18:25:36 25 4
gpt4 key购买 nike

我在序列化包含派生对象列表的字典时遇到问题。序列化输出包含

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

但没有结果。

最佳答案

今天又遇到了,很失望,所以没有答案。

如果它是字段或属性中的对象列表,将其添加到顶部:

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

...

如果是单个对象添加:

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

关于c# - 没有 xsi :type 的派生对象的序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6909649/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com