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