1

我已经为此苦苦挣扎了一段时间。这是我的情况 - 我试图序列化的类的属性之一包含一个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以便每次看到一个IList或一个IEnumerable时将它们“转换”为一个列表(或数组)。任何帮助将不胜感激。

4

2 回答 2

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>. 通常不会工作..所以我把它包装起来,然后序列化包装好的。如果需要,您可以将其转换为普通基类..不是最好的解决方案,但是既然您说您不能更改基类,那么这里没有太多选择...

于 2013-03-16T08:31:29.993 回答
0

通过实现编写你自己的自定义XmlSerializerIXmlSerializable,参考msdn的用法

于 2013-03-16T07:39:31.547 回答