2013-04-12 38 views
1

我有兩個類:ServiceTriggerServiceCalendar序列化錯誤:有反映類型的錯誤

當我序列model.Triggers我得到一個異常說:

Cannot serialize member 'yyy.ServiceTrigger.ServiceDaysOfWeek' of type
'System.Collections.Generic.IEnumerable`1[[yyyy.ServiceCalendar, yyy.ChangeAD, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]',
see inner exception for more details."}

我已經創建了一個IEnumerable<ServiceTrigger>

IEnumerable<ServiceTrigger> serviceTriggers = model.Triggers; 
XDocument xDoc = SerializationUtil.Serialize(model.Triggers); 

頭等艙是這樣的:

[DataContract] 
public class ServiceTrigger 
{ 
    [DataMember(Name = "triggerID")] 
    public long TriggerID { get; set; } 

    [DataMember(Name = "name")] 
    public string Name { get; set; } 

    [DataMember(Name = "dateStart")] 
    public string DateStart { get; set; } 

    [DataMember(Name = "code")] 
    public string Code { get; set; } 

    [DataMember(Name = "isActive")] 
    public bool IsActive { get; set; } 

    [DataMember(Name = "dateFrom")] 
    public string DateFrom { get; set; } 

    [DataMember(Name = "dateTo")] 
    public string DateTo { get; set; } 

    [DataMember(Name = "currentState")] 
    public string CurrentState { get; set; } 

    [DataMember(Name = "daysOfWeek")] 
    public IEnumerable<ServiceCalendar> ServiceDaysOfWeek { get; set; } 

    [DataMember(Name = "monthsOfYear")] 
    public IEnumerable<ServiceCalendar> MonthsOfYear { get; set; } 

    [DataMember(Name = "daysOfMonth")] 
    public IEnumerable<ServiceCalendar> DaysOfMonth { get; set; } 
} 

二等是這樣的:

[DataContract] 
public class Calendar 
{ 
    [DataMember(Name = "id")] 
    public int Id { get; set; } 

    [DataMember(Name = "name")] 
    public string Name { get; set; } 

    [DataMember(Name = "code")] 
    public string Code { get; set; } 

    [DataMember(Name = "isActive")] 
    public bool IsActive { get; set; } 
) 

我的序列化類是這樣的:

public static class SerializationUtil 
{ 
    public static T Deserialize<T>(XDocument doc) 
    { 
     XmlSerializer xmlSerializer = new XmlSerializer(typeof(T)); 

     using (var reader = doc.Root.CreateReader()) 
     { 
      return (T)xmlSerializer.Deserialize(reader); 
     } 
    } 

    public static XDocument Serialize(this object obj) 
    { 
     XmlSerializer xmlSerializer = new XmlSerializer(obj.GetType()); 

     XDocument doc = new XDocument(); 
     using (var writer = doc.CreateWriter()) 
     { 
      xmlSerializer.Serialize(writer, obj); 
     } 

     return doc; 
    } 
} 
+0

您需要修復您的文章的格式異常。像「我的序列化類是這樣的」的評論不應該在代碼塊中,這使得它很難閱讀。你究竟在哪裏得到例外?你可以請發佈完整的例外? – tnw

+0

無法序列類型的成員 'yyy.ServiceTrigger.ServiceDaysOfWeek' 'System.Collections.Generic.IEnumerable'1 [[yyyy.ServiceCalendar,yyy.ChangeAD,版本= 1.0.0.0,文化=中性公鑰=空]]',看到內部異常的更多細節。「} – user2264703

+0

無法序列類型System.Collections.Generic.IEnumerable'1的構件yyy.ServiceTrigger.ServiceDaysOfWeek [yyy.ServiceCalendar,YYY,版本= 1.0.0.0,文化=中性公鑰=空] ]因爲它是一個接口。「 – user2264703

回答

4

你不能序列化接口。您需要使用實際的對象,例如List<ServiceCalendar>

還要注意的是ServiceCalendar需要一個默認的構造函數而不必爲了參數XmlSerializer反序列化時創建它。如果你添加一個帶參數的自定義構造函數,這一點很重要。如果你根本沒有構造函數,那麼默認的構造函數就已經存在了。

例子:

public class ServiceCalendar { 
    // this is required for deserialization if a .ctor with parameters is present. 
    public ServiceCalendar() { } 

    public ServiceCalendar(int id) { 
     this.id = id; 
    } 
} 

否則你會得到類似

No parameterless constructor defined for type of ServiceCalendar