2011-10-26 34 views
3

我有一個類,它看起來是這樣的:RegExs的WCF DataContract隨着名單將不序列正確

[DataContract] 
public class InboundMailbox 
{ 
    public const char EmailSeparator = ';'; 

    [DataMember] 
    public string POP3Host { get; set; } 

    [DataMember] 
    public string EmailId { get; set; } 

    [DataMember] 
    public string WebServiceURL { get; set; } 

    [DataMember] 
    public List<Regex> Allowed { get; set; } 

    [DataMember] 
    public List<Regex> Disallowed { get; set; } 
} 

如果AllowedDisallowed是空的,然後將其序列在我的WCF服務就好了。只要其中一個列表包含值,我就會在CommunicationException中得到它:

套接字連接被中止。這可能是由於處理您的消息的錯誤 或遠程主機的 接收超時或基礎網絡資源問題所致。本地套接字 超時時間爲'00:00:29.9899990'。

爲什麼它讓我很難序列化這兩個屬性?提前致謝。

+0

通過電線發送的Regexes列表有多大? –

+0

如果我把一個正則表達式放在一個列表中,我會得到這個異常。正則表達式本身並不長,大概<20個字符。 –

回答

3

Regex類實現了ISerializable接口,這意味着它被序列化爲屬性包(字符串/對象字典)。在Reflector中查看Regex類的實現ISerializable.GetObjectData,它顯示它序列化模式(字符串)和選項(RegexOptions類型)。由於類型是ISerializable,WCF不知道知道RegexOptions,所以它將無法序列化此類型。

一個簡單的解決方案是簡單地「告訴」 WCF,這是一個已知類型,所以序列化就可以了(一個簡單的地方是在InboundMailbox類使用[KnownType]屬性(見下文申報)。另選擇是有數據成員的正則表達式,而不是Regex本身(以及可能的選項,以及)。

public class StackOverflow_7909261 
{ 
    [DataContract] 
    [KnownType(typeof(RegexOptions))] 
    public class InboundMailbox 
    { 
     public const char EmailSeparator = ';'; 

     [DataMember] 
     public string POP3Host { get; set; } 

     [DataMember] 
     public string EmailId { get; set; } 

     [DataMember] 
     public string WebServiceURL { get; set; } 

     [DataMember] 
     public List<Regex> Allowed { get; set; } 

     [DataMember] 
     public List<Regex> Disallowed { get; set; } 
    } 

    public static void Test() 
    { 
     MemoryStream ms = new MemoryStream(); 
     InboundMailbox obj = new InboundMailbox 
     { 
      POP3Host = "popHost", 
      EmailId = "email", 
      WebServiceURL = "http://web.service", 
      Allowed = new List<Regex> 
      { 
       new Regex("abcdef", RegexOptions.IgnoreCase), 
      }, 
      Disallowed = null, 
     }; 
     DataContractSerializer dcs = new DataContractSerializer(typeof(InboundMailbox)); 
     try 
     { 
      dcs.WriteObject(ms, obj); 
      Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray())); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex); 
     } 
    } 
} 

順便說一句,你得找出錯誤,如果你啓用了跟蹤在服務器上方面;它會有一個例外情況說RegexOptions不是預期的類型

+0

你有沒有知道你是我的英雄,我想成爲什麼?我可以飛得比鷹還高,因爲你是我翅膀下面的風。 –