2012-05-15 27 views
8

私はcontactという名前の抽象クラスとcontactというクラスを継承する別のクラスを持っています。私はタイプの接触のパラメータを取るメソッドでWCFサービスを扱っています。 しかし、私が持っているものは、私が渡したいクライアントのインスタンスです。このエラーが直面している イム:WCFサービスオブジェクトのシリアル化

Type 'xxx.Client' with data contract name 'Client:http://schemas.datacontract.org/2004/07/xxx' is not expected. Add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.

答えて

5

WCFは抽象クラスで直接動作しません。 datacontractクラスまたはserviceクラスでKnownType属性を使用します。以下は例です。

[DataContract] 
[KnownType(typeof(Client))] 
public class Contact 
{ 
    ... 
} 

[ServiceContract] 
[ServiceKnownType(typeof(Client))] 
public interface IMyService 
{ 
    contact getcontact(Guid id); 
} 
+0

ありがとうございました!ちょうど良い作品 – ancdev

+0

問題はありません。働いている場合は回答として受け入れてください。 – daryal

7

あなたはDataContractSerializerがClientContactのタイプであることを知っているように定義さ。

これを行うにはいくつかの方法がありますが、すべてKnownType属性またはServiceKnownType属性を使用しています。

KnownTypeは、Clientクラスに配置して、DataContractSerializerにKnockTypeがContactであることを通知できます。

[DataContract] 
[KnownType(typeof(Client))] 
public class Contact{} 

KnownTypeもこのクラスを直列化するときにも、この他のクラスが発生する可能性があることを示すために、クラスに配置することができます。この場合、

[DataContract] 
[KnownType(typeof(Client))] 
public class Meeting 
{ 
    Contact MeetingContact{get;} 
} 

あなたがKnownTypeを指定せずに逃げることができます:

あなたが実際にClientが含まれていてもよいContactである性質を持っているDataContractクラスを持っている場合は、これを行うことができますクライアント。コレクションを返すプロパティがあり、コレクションに含めることができる型を指定する場合は、これを行うこともできます。

あなたは、代わりに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の型を返すことがお知らせします。既知のタイプと同様に、静的メソッドを使用して、サービスの既知のタイプを提供することもできます。

+2

+1:2分が遅すぎますが、もっと便利な詳細です。 –

+0

詳細情報+1 – daryal

関連する問題