2013-10-21 28 views
2

我想序列化這個類:XmlSerializer.Serialize異常:「類型[type]不是預期的。」

[XmlRoot("ArrayOfEvent")] 
public class EventList 
{ 
    public EventList() 
    { 

    } 

    public EventList(IEnumerable<Event> items) 
    { 
     Items = items; 
    } 

    [XmlArray("")] 
    public IEnumerable<Event> Items { get; set; } 
} 

這裏是包含在EventList.ItemsEvent類:

public class Event 
{ 
    [XmlElement] 
    public string ID { get; set; } 

    [XmlElement] 
    public string Title { get; set; } 

    [XmlElement] 
    public string Description { get; set; } 

    [XmlElement] 
    public string Location { get; set; } 

    [XmlElement] 
    public DateTime? StartTime { get; set; } 

    [XmlElement] 
    public DateTime? EndTime { get; set; } 

    [XmlElement] 
    public bool? AllDay { get; set; } 
} 

這裏的地方發生錯誤:

public static XmlDocument ToXmlDocument<T>(T obj) 
{ 
    var xmlDocument = new XmlDocument(); 
    var nav = xmlDocument.CreateNavigator(); 

    if (nav != null) 
    { 
     using (var writer = nav.AppendChild()) 
     { 
      var ser = new XmlSerializer(typeof(T)); 
      ser.Serialize(writer, obj); //throws exception 
     } 
    } 

    return xmlDocument; 
} 

XmlSerializer給我致電Serialize()時發生此錯誤:

The type Domain.EventList was not expected. 
Use the XmlInclude or SoapInclude attribute to specify types that are not 
known statically. 

我在EventList類還有Event類使用[XmlInclude(typeof(EventList))]嘗試,但沒有這些想法的工作。我不知道還有什麼要做。

有人熟悉這個問題嗎?我該如何解決它?提前致謝。

+0

也許一個愚蠢的評論,但你使用[Serializable]屬性? – gleng

+1

@gleng'XmlSerializer'對'[Serializable]'沒有興趣' –

+0

@gleng是的,我嘗試過,但沒有效果。 – Kehlan

回答

2

基本上,列表有點特別XmlSerializer。你將有更多的成功,如果你申報DTO有一個具體的列表類型,例如:

[XmlArray("")] 
public List<Event> Items { get; set; } 
+0

不幸的是,這並沒有改變任何事情。同樣的錯誤。 – Kehlan

+0

@kehrk首先,它只識別(列表)實現IList 的事情(或者它可能是IList加一個非對象索引器 - 這是一個通用的框架模式) - 但其次,它只適用於具體列表類型:如果您使用界面進行嘗試,則會引發異常,表示不滿意。大概是由於重建。有序列化程序不強制這些要求,但這只是'XmlSerializer'如何工作 –

+0

@kehrk我試過這個例子 - 它對我的情況很好,那就是列表。你能給出一個完整的(可運行的)失敗的例子嗎? –