您需要让 DataContractSerializer 知道 Client 是 Contact 的一种类型。
有几种方法可以做到这一点,但它们都围绕使用KnownType 属性或ServiceKnownType 属性。
KnownType 可以放在 Client 类上,告诉 DataContractSerializer 它是 Contact 的 KnownType。
[DataContract]
[KnownType(typeof(Client))]
public class Contact{}
KnownType也可以放在一个类上,表示在序列化这个类时你也可能遇到这个其他类。
如果您有一个DataContract 类,该类的属性为Contact,而实际上可能包含Client,则您可能需要这样做:
[DataContract]
[KnownType(typeof(Client))]
public class Meeting
{
Contact MeetingContact{get;}
}
在这种情况下,您可以不用在客户端上指定 KnownType。如果您有一个返回集合的属性并且您想指定可以在集合中的类型,您可能还想这样做。
您可以不指定 KnownType 的实际类型,而是指定将返回已知类型的静态方法的名称:
[DataContract]
[KnownType("GetKnownTypes")]
public class Meeting
{
Contact MeetingContact{get;}
private static Type[] GetKnownType()
{
return new Type[]{typeof(Client)};
}
}
您也可以通过configuration file指定已知类型。
ServiceKnownTypes 以类似的方式工作,但在服务本身上指定:
[ServiceKnownType(typeof(Client))]
[ServiceContract()]
public interface IMyServiceContract
{
[OperationContract]
Contact GetContact();
}
此设置将使 DataContactSerializer 知道任何方法都可能返回类型为 Client 的类型。与已知类型类似,您也可以使用静态方法来提供已知类型的服务。