2013-03-16 79 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

相關問題