XML-узел сериализации как родительский класс неправильно вместо дочернего - PullRequest
0 голосов
/ 26 сентября 2018

Я сериализую класс, который неправильно создает узел одного из его свойств.моя классовая структура выглядит следующим образом:

Вот верхний класс, который я сериализую

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

MultiValueDescription наследует от SingleValueDescription, который наследует от Description.

Description имеет тег XMlIncludeдля описания как единственного, так и множественного значения

Моя проблема возникает, когда я иду для сериализации описания, имеющего тип MultiValueDescription, узел xml сериализует его как SingleValueDescription.

Если я удаляю XmlArrayItemЗапись для SingleValueDescription из класса XmlReportConfiguration, затем она работает так, как я хочу, но я не могу удалить это объявление по понятным причинам.

Есть ли здесь какой-то тег / объявление, которое я пропускаю и которое вызывает сериализаторигнорировать дочерний класс для узла и использовать родительский класс?

Вот метод при создании сериализатора:

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

1 Ответ

0 голосов
/ 28 сентября 2018

Нашел решение.Полиморфизм вызывает проблемы при сериализации.В своем отчете я использовал список следующего нового класса, и он решил мои проблемы.

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