XmlSerializer - IEnumerable or IList as LIst

本文关键字:as LIst IList or IEnumerable XmlSerializer | 更新日期: 2023-09-27 18:04:05

我已经为此挣扎了一段时间了。这是我的情况—我试图序列化的类的属性之一包含IEnumerable(它不能被序列化,因为它是一个接口),我不能去改变属性(我也不能给它添加属性)。下面是我目前得到的代码:

// Ignore the byte array containing the Data for the serialization
xmlAttrOverrides.Add(typeof (FileContent), "Data", xmlIgnoreAttr);
using (var writer = xmlDocument.CreateWriter())
{
    var serializableTypes = GetSerializableSubTypes();
    var serializer = new XmlSerializer(documentPackage.GetType(), xmlAttrOverrides, serializableTypes, null, null);
    serializer.Serialize(writer, documentPackage);
}

是否有一种方法来设置XmlSerializer,以便每次看到IListIEnumerable时将它们"转换"为列表(或数组)。如有任何帮助,不胜感激。

XmlSerializer - IEnumerable or IList as LIst

由于不能更改类,因此创建一个新类,从要序列化的类和IXmlSerializable继承。此外,您可以使用new关键字覆盖基本颜色数组。

试试这个:

public class Something
{
    public int Id { get; set; }
    public string Text { get; set; }
    public IEnumerable<string> Colors { get; set; }
}
public class MySerializableSomething : Something, IXmlSerializable
{
    public new List<string> Colors { get; set; }
    public MySerializableSomething()
    {
        Colors = new List<string>();
    }
    public XmlSchema GetSchema()
    {
        return null;
    }
    public void ReadXml(XmlReader reader)
    {
        while (reader.Read())
        {
            switch (reader.LocalName)
            {
                case "Id": Id = reader.ReadElementContentAsInt(); break;
                case "Text": Text = reader.ReadElementContentAsString(); break;
                case "Color": Colors.Add(reader.ReadElementContentAsString()); break;
            }
        }
    }
    public void WriteXml(XmlWriter writer)
    {
        writer.WriteElementString("Id", Id.ToString());
        writer.WriteElementString("Text", Text);
        writer.WriteStartElement("Colors");
        foreach (var color in Colors)
        {
            writer.WriteElementString("Color", color);
        }
        writer.WriteEndElement();
    }
}

这里你可以看到我有一个IEnumerable<string>。通常是行不通的…所以我把它包装起来,然后序列化包装好的那个。如果需要,可以将其转换为普通的基类。不是最好的解决方案,但既然你说你不能改变基类,那么这里没有很多选项…

通过实现IXmlSerializable编写您自己的自定义XmlSerializer类,参考msdn了解其用法

相关文章: