C# 不正确地将节点序列化为父类而不是子类

C# 不正确地将节点序列化为父类而不是子类,c#,serialization,xml-serialization,C#,Serialization,Xml Serialization,我正在序列化一个类,该类错误地创建了其属性之一的节点。我的班级结构如下: 这是我正在序列化的顶级类 [DataContract] public class XmlReportConfiguration { [DataMember] [XmlArrayItem(nameof(SingleValueDescription), typeof(SingleValueDescription))] [XmlArrayItem(nameo

我正在序列化一个类,该类错误地创建了其属性之一的节点。我的班级结构如下:

这是我正在序列化的顶级类

    [DataContract]
    public class XmlReportConfiguration
    {
        [DataMember]
        [XmlArrayItem(nameof(SingleValueDescription), typeof(SingleValueDescription))]
        [XmlArrayItem(nameof(MultiValueDescription), typeof(MultiValueDescription))]
        public List<Description> Descriptions { get; set; }
    }

找到了解决办法。多态性在序列化时会导致问题。在我的报告配置中,我使用了以下新类的列表,它解决了我的问题

[DataContract]
public class SerializableDescription : IXmlSerializable
{
    #region Properties

    public SerializableDescription()
    {

    }

    public SerializableDescription(Description description)
    {
        Description = description;
    }

    [DataMember]
    public Description Description { get; set; }

    #endregion

    #region Methods

    public XmlSchema GetSchema()
    {
        return null;
    }

    public void ReadXml(XmlReader reader)
    {
        reader.MoveToContent();
        string typeStr = reader.GetAttribute("Type");
        Type type = TypeCache.GetTypeEx(typeStr);
        XmlSerializer ser = new XmlSerializer(type);
        reader.ReadStartElement();
        Description = (Description)ser.Deserialize(reader);
        reader.ReadEndElement();
    }

    public void WriteXml(XmlWriter writer)
    {
        Type type = Description.GetType();
        writer.WriteAttributeString("Type", type.FullName);
        XmlSerializer ser = new XmlSerializer(type);
        ser.Serialize(writer, Description);
    }

    #endregion
}

你能和我共用一个房间吗?甚至不清楚您使用的是
DataContractSerializer
还是
XmlSerializer
。我使用的是XmlSerializer传入typeof(XmlReportConfiguration)。我添加了序列化方法。无法复制,请参阅。但由于缺少许多类型,您的代码无法编译。此外,未显示反序列化代码。所以我不得不做一些猜测。添加了反序列化部分,但它非常通用,所以我不知道它在这里会有什么帮助。找到了解决我问题的方法。张贴我用过的东西。
[DataContract]
public class SerializableDescription : IXmlSerializable
{
    #region Properties

    public SerializableDescription()
    {

    }

    public SerializableDescription(Description description)
    {
        Description = description;
    }

    [DataMember]
    public Description Description { get; set; }

    #endregion

    #region Methods

    public XmlSchema GetSchema()
    {
        return null;
    }

    public void ReadXml(XmlReader reader)
    {
        reader.MoveToContent();
        string typeStr = reader.GetAttribute("Type");
        Type type = TypeCache.GetTypeEx(typeStr);
        XmlSerializer ser = new XmlSerializer(type);
        reader.ReadStartElement();
        Description = (Description)ser.Deserialize(reader);
        reader.ReadEndElement();
    }

    public void WriteXml(XmlWriter writer)
    {
        Type type = Description.GetType();
        writer.WriteAttributeString("Type", type.FullName);
        XmlSerializer ser = new XmlSerializer(type);
        ser.Serialize(writer, Description);
    }

    #endregion
}