2013-02-17 24 views
1

我收到下面的異常信息,而序列化對象到XML:序列化異常:數據合同預計不會

{"Type 'Alerter.EmailSender' with data contract name 'EmailSender:http://schemas.datacontract.org/2004/07/Alerter' is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer."} 

這是我試圖序列化的一個對象到XML文件中的類:

namespace Alerter 
{ 
    [DataContract] 
    public class EmailSender : IAction 
    { 
    private EmailSetting _emailSetting; 
    private SmtpClient _smtpClient; 
    [DataMember] 
    public bool IncludeFullDetails 
    { 
     get; 
     set; 
    } 
    [DataMember] 
    public string[] Receivers 
    { 
     get; 
     set; 
    } 

    public EmailSender() 
    { 
     _emailSetting = new EmailSetting(); 
     SetupClient(); 
    } 

    private void SetupClient() 
    { 
     // Some Logic 
    } 


    public void Report(LogDictionary logDictionary) 
    { 
     // Some Logic 
    } 
    } 
} 

這是我使用的序列化的代碼:

using (FileStream writer = new FileStream(fileName, FileMode.Create)) 
     { 
      DataContractSerializer ser = 
       new DataContractSerializer(typeof(List<Rule>)); 
      ser.WriteObject(writer, list); 
     } 

我很欣賞你的他LP。

回答

2

請確保您已使用指定該EmailSender類爲已知類型的串行器proper constructor

DataContractSerializer ser = new DataContractSerializer(
    typeof(List<Rule>), 
    new[] { typeof(EmailSender) } 
); 
ser.WriteObject(writer, list); 

你需要,這是因爲可能是在Rule類的對象圖你只有使用的原因所有成員和串行器的接口都不知道EmailSender實現的存在。

對於在Rule對象圖中不是靜態已知的所有其他類型,您應該這樣做。

+0

是的,就是這樣......謝謝先生。 – 2013-02-17 13:17:31

+0

很高興我能幫到你。 – 2013-02-17 13:23:28