XmlSerializer - IEnumerable或IList作为LIst

时间:2013-03-16 07:34:46

标签: c# .net xml-serialization

我一直在努力解决这个问题。 这是我的情况 - 我正在尝试序列化的类的一个属性包含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将它们“转换”为列表(或数组)。 任何帮助都将受到高度赞赏。

2 个答案:

答案 0 :(得分:2)

由于您无法更改类,因此请从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>。通常不会工作..所以我包装它​​然后序列化包装的。如果你需要,你可以将它转换为正常的基类..不是最好的解决方案,但既然你说你不能改变基类,那么这里没有很多选项......

答案 1 :(得分:0)

通过实施XmlSerializer编写您自己的自定义IXmlSerializable课程,请参阅msdn了解其使用情况