2011-10-26 7 views
3

나는 이런 식으로 뭔가를 보이는 클래스가 직렬화하지 않음. 이 목록 중 하나에 값이 포함되면 CommunicationException이 발생합니다.WCF DataContract와 목록은 제대로

소켓 연결이 중단되었습니다. 이 메시지는 메시지가 처리 중이거나 원격 호스트가 수신 시간 초과를 초과했거나 기본 네트워크 리소스 문제로 인해 발생할 수 있습니다. 로컬 소켓 시간 초과가 '00 : 00 : 29.9899990 '입니다.

왜 두 속성을 직렬화하는 것이 어려울까요? 미리 감사드립니다.

+0

당신은 전선을 통해 보내는 Regexes의 목록은 얼마나 큽니까? –

+0

목록 중 하나에 하나의 정규식을 넣으면 예외가 발생합니다. 그리고 정규 표현식 자체는 그다지 길지 않습니다. 아마도 20 자 미만입니다. –

답변

3

Regex 클래스는 ISerializable 인터페이스를 구현합니다. 즉, 속성 백 (문자열/객체 사전)로 직렬화되었음을 의미합니다. Reflector에서 Regex 클래스에 대한 ISerializable.GetObjectData 구현을 살펴보면 패턴 (문자열)과 옵션 (유형 RegexOptions)을 직렬화한다는 것을 알 수 있습니다. 형식이 ISerializable이므로 WCF는 RegexOptions을 알지 못하므로이 형식을 serialize하지 못합니다.

하나의 간단한 해결책은 직렬화는 아래를 참조합니다 (InboundMailbox 클래스의 [KnownType] 속성을 사용 선언 (쉬운 장소를 작동 할 수 있도록 간단하게), 이것은 알려진 유형이다. 또 다른를 WCF를 "말"하는 것입니다 옵션 대신 Regex 자체의 정규식 패턴으로 데이터 멤버 (뿐만 아니라 가능한 옵션)를 가지고하는 것입니다. BTW

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

당신은 당신이 내 영웅이고 내가 원하는 모든 것을 알고 있습니까? 나는 독수리보다 높이 날 수있다. 왜냐하면 너는 내 날개 밑의 바람이기 때문이다. –