您需要让 DataContractSerializer 知道 aClient
是Contact
.
有几种方法可以做到这一点,但它们都围绕着使用一个KnownType
或多个ServiceKnownType
属性。
KnownType
可以放在类上Client
告诉 DataContractSerializer 它是一个 KnownType Contact
。
[DataContract]
[KnownType(typeof(Client))]
public class Contact{}
也可以放在一个类上,KnownType
以表明在序列化这个类时你也可能遇到这个其他类。
DataContract
如果你有一个类的属性是 a Contact
,实际上可能包含 a ,你可能想要这样做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)};
}
}
也可以通过配置文件指定已知类型。
ServiceKnownTypes 以类似的方式工作,但在服务本身上指定:
[ServiceKnownType(typeof(Client))]
[ServiceContract()]
public interface IMyServiceContract
{
[OperationContract]
Contact GetContact();
}
此设置将使 DataContactSerializer 知道任何方法都可能返回 type 类型Client
。以与已知类型类似的方式,您还可以使用静态方法来提供已知类型的服务。