ClientaがのタイプであることをDataContractSerializerに通知する必要がありContactます。
これを行うにはいくつかの方法がありますが、それらはすべて、1KnownTypeつまたは複数のServiceKnownType属性の使用を中心に展開します。
KnownTypeをクラスに配置して、DataContractSerializerClientにKnownTypeであることを通知できますContact。
[DataContract]
[KnownType(typeof(Client))]
public class Contact{}
をクラスに配置して、このKnownTypeクラスをシリアル化するときに、この他のクラスにも遭遇する可能性があることを示すこともできます。
実際に:を含む可能DataContract性のあるプロパティを持つクラスがある場合は、これを実行することをお勧めします。ContactClient
[DataContract]
[KnownType(typeof(Client))]
public class Meeting
{
Contact MeetingContact{get;}
}
この場合、クライアントで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は、どのメソッドもタイプのタイプを返す可能性があることを認識しますClient。既知のタイプと同様に、静的メソッドを使用してサービスの既知のタイプを提供することもできます。