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
,以便每次看到IList
或IEnumerable
时将它们"转换"为列表(或数组)。如有任何帮助,不胜感激。
由于不能更改类,因此创建一个新类,从要序列化的类和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了解其用法