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
이 필요하지 않다는 예외가 있습니다.
당신은 전선을 통해 보내는 Regexes의 목록은 얼마나 큽니까? –
목록 중 하나에 하나의 정규식을 넣으면 예외가 발생합니다. 그리고 정규 표현식 자체는 그다지 길지 않습니다. 아마도 20 자 미만입니다. –