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