无法将System.Net.Mail.MailAddress序列化为Json

时间:2014-05-12 04:59:14

标签: c# json serialization datacontractjsonserializer

我有一个电子邮件课程

public class EmailInfo
{
    public MailAddress SenderEmailAddress { get; set; }
    public MailAddressCollection ReceiverEmailAddress { get; set; }
    public MailAddressCollection CCEmailAddress { get; set; }
    public MailAddressCollection BCCEmailAddress { get; set; }
    public AttachmentCollection Attachment { get; set; }
    public string Subject { get; set; }
    public DateTime EmailDate { get; set; }
}

当我尝试序列化类型EmailInfo的列表时。我收到了以下错误

Type 'System.Collections.Generic.List`1[[Darena.EmailParser.EmailInfo, Darena.EmailParser, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' with data contract name 'ArrayOfEmailInfo:http://schemas.datacontract.org/2004/07/Darena.EmailParser' 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.

我正在使用

进行序列化
 DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(EmailInfo));
        MemoryStream ms = new MemoryStream();
        ser.WriteObject(ms, emailInfos);
        string jsonString = Encoding.UTF8.GetString(ms.ToArray());
        ms.Close();
        return jsonString;

任何帮助

2 个答案:

答案 0 :(得分:0)

您要序列化的类型必须是可序列化的。

对于DataContractJsonSerializer,这意味着您必须使用EmailInfo属性及其成员(只是那些要包含在序列化字符串中的成员)装饰您的类(DataContractDataMember } attribute。

但是,在您的情况下,您引用的是第三方类型,例如MailAddress和其他不可序列化的类型,因此您必须提供某种类型的自定义序列化,而且它对DataContractJsonSerializer非常有限。

查看Json.NET库,它为JSON序列化提供了更大的灵活性,例如。 JsonConverter。你会在这个网站上找到很好的例子。

答案 1 :(得分:0)

List无法支持序列化。您可以使用对象[]而不是List。