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);
        }

私はあなたの助けに感謝します。

4

1 に答える 1

2

:を使用して、このEmailSenderクラスをシリアライザーの既知のタイプとして指定していることを確認してください。proper constructor

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

これが必要な理由は、おそらくRuleクラスのオブジェクトグラフでは、すべてのメンバーのインターフェイスのみを使用しており、シリアライザーは実装IActionの存在についてさえ知らないためです。EmailSender

Ruleオブジェクトグラフで静的に認識されていない他のすべてのタイプについても同じことを行う必要があります。

于 2013-02-17T13:13:27.873 に答える