该类Regex
实现了ISerializable
接口,这意味着它被序列化为一个属性包(字符串/对象的字典)。查看ReflectorISerializable.GetObjectData
中Regex
类的实现,它表明它序列化了模式(字符串)和选项(类型RegexOptions
)。由于类型为ISerializable
,WCF 不知道,RegexOptions
因此无法序列化该类型。
一个简单的解决方案是简单地“告诉” WCF 这是一个已知类型,因此序列化将起作用(声明它的一个简单地方是使用类[KnownType]
中的属性InboundMailbox
(见下文)。另一种选择是拥有数据成员作为正则表达式模式而不是其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
不是预期的。