2011-01-05 42 views
2

は、私は2つのクラスの次のセットアップを持っています。しかし、私は、サービスがChildDataクラスをエンドユーザーに公開するだけで、マークアップされたDataMemberプロパティを親からプルする必要があります。例えば。消費するクライアントは、ように見えたスタブクラスを持っているでしょう:WCFとオブジェクトの継承

public class ChildData{ 
    public string Title{get;set;} 
    public string Abstract{get;set;} 
} 

私はスタブクラス上記のように、親と子のクラスを使用している場合のみ、抽象プロパティが含まれています。

私はそうのようなChildDataクラスにKnownType属性を使用して見てきました:

[DataContract] 
[KnownType(typeOf(ParentData)] 
public class ChildData : ParentData{ 
    [DataMember] 
    public string Abstract{get;set;} 
} 

、これは動作しませんでしたが。

次に、DataContract属性をParentDataクラスに適用しましたが、これでクライアントアプリケーションに2つのスタブクラスが作成されますが、これは不要です。

私はあなたのParentDataクラスも[DataContract]属性を持っている必要がありますと信じて、それはすなわちChildData

+0

[WCFサービスデータコントラクトの基底型を非表示/平坦化する方法はありますか?](http://stackoverflow.com/questions/3499788/is-there-any-way-to-hide-flatten) -base-types-in-wcf-service-data-contracts) –

答えて

1

サブクラスのものに継承を平らにする必要がありシリアライザを伝えるためにどのような方法があります:

[DataContract] 
public class ParentData 
{ 
    [DataMember] 
    public string Title{get;set;} 
} 
は、

[Serializable]は、デフォルトのデータコントラクトシリアライザを使用しているWCFにはあまり役に立ちません。

+0

ParentDataクラスに[DataContract]属性を追加する際の問題は、消費するクライアントが継承チェーンを表す2つのスタブクラスを作成することです。避けるために。 これを回避するには、私のプロジェクトを動かすことができます.ParentDataクラスをインターフェイスにすることです。これは理想的ではありませんが、当面はうまくいくでしょう。 –

0

は、私はあなたのParentDataクラスは抽象マークする必要があります信じているし、また[のDataContract]属性を持っている必要があります:

[DataContract] 
public abstract class ParentData 
{ 
    [DataMember] 
    public string Title{get;set;} 
} 

かすが言ったように、[直列化]本当にWCFは、デフォルトのデータを使用して助けにはなりません契約シリアライザ。

関連する問題