【问题标题】:XML serializing node as parent class incorrectly instead of childXML错误地将节点序列化为父类而不是子类
【发布时间】:2018-09-26 15:29:43
【问题描述】:

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

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

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

MultiValueDescription 继承自 SingleValueDescription,而 SingleValueDescription 继承自 Description。

Description 具有用于单值和多值描述的 XMlInclude 标记

我的问题是当我去序列化类型为 MultiValueDescription 的描述时,xml 节点将其序列化为 SingleValueDescription。

如果我从 XmlReportConfiguration 类中删除 SingleValueDescription 的 XmlArrayItem 条目,它会按我的意愿工作,但由于显而易见的原因,我无法删除该声明。

是否有一些我在这里遗漏的标记/声明导致序列化程序忽略节点的子类并使用父类?

创建序列化器时的方法如下:

    public static string SerializeReportConfiguration(XmlReportConfiguration config)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(XmlReportConfiguration));
        StringBuilder sb = new StringBuilder();

        using (TextWriter writer = new StringWriter(sb))
        {
            serializer.Serialize(writer, config);
        }

        return sb.ToString();
    }


    public static XmlReportConfiguration DeserializeReportConfiguration(string xml)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(XmlReportConfiguration));
        using (StringReader reader = new StringReader(xml))
        {
            XmlReportConfiguration sessionConfig = serializer.Deserialize(reader) as XmlReportConfiguration;
            return sessionConfig;
        }
    }

【问题讨论】:

  • 你能分享一个minimal reproducible example吗?甚至不清楚您使用的是DataContractSerializer 还是XmlSerializer
  • 我正在使用 XmlSerializer 传入 typeof(XmlReportConfiguration)。我添加了我的序列化方法。
  • 无法复制,请参阅dotnetfiddle.net/EGivyS。由于缺少许多类型,您的代码无法编译。此外,未显示反序列化代码。所以我不得不做出一些猜测。
  • 添加了反序列化部分,但它非常通用,所以我不知道它在这里有什么帮助。
  • 找到了我的问题的解决方案。贴出我用过的东西。

标签: c# serialization xml-serialization


【解决方案1】:

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

[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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多