2013-03-16 36 views
1

我一直在努力与此一段时间了。 这是我的情况 - 我尝试序列化的类的属性之一包含IEnumerable(它不能被序列化,因为它是一个接口),我不能去改变属性(我不能给它添加属性)。 这是到目前为止,我已经得到了代码:XmlSerializer - IEnumerable或IList作为LIst

// 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他们“转换”到一个列表(或阵列) 。 任何帮助将不胜感激。

+0

' IEnumerable'不能被反序列化......澄清你是否可以保存对象可能是有用的。 – 2013-03-16 07:39:28

+0

其实我没关系,即使忽略它一切,如果这将工作? – 2013-03-16 07:41:40

回答

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>。通常不会工作..所以我包装它​​,然后序列化包装的一个。如果需要,则可以将其转换为正常的基类..不是最好的解决方案,但既然你说你不能改变的基类,那么就没有很多的选择在这里...

+0

是的,好东西,伙伴。我想我会走这个方向。谢谢。 – 2013-03-16 08:59:17

0

通过实施IXmlSerializable编写自己的定制XmlSerializer类,见msdn其使用

+0

IXmlSerializable必须由我尝试序列化的类实现(这不是我想要做的,我不能触及这些类,我必须使用的是XmlSerializer)。 – 2013-03-16 07:42:48

+2

@DimitarDimitrov IXmlSerializable不需要由你希望序列化的类来实现,你可以创建一个可以接受任何类型并生成xml的单独类。 – 2013-03-16 07:50:42

相关问题