のための基本クラスとして派生クラスの治療:私は派生を作成し、サーバー側のアセンブリでWCFのDataContract - 私は、単純なデータコントラクト持つシリアライズ
[ServiceContract]
public interface IMyDataService
{
[OperationContract]
MyData GetAwesomeData();
}
:
[DataContract]
public class MyData
{
[DataMember]
public string AwesomeData { get; set; }
}
とサービス契約を処理するクラス:
とサービス実装:
public class MyDataService: IMyDataService
{
public MyData GetAwesomeData()
{
return new MyDataWithInnerds(HupnerRayvakManager.GetInitializationStuff());
}
}
MyDataWithInnerdsは、純粋なデータコントラクトMyDataの機能実装です。
MyDataをデコレートしてMyDataWithInnerdsを参照していないと、シリアライザにMyDataWithInnerdsをMyDataとしてシリアル化するように指示されていませんか? MyDataを使用したアセンブリもクライアントに提供されます。私は、サーバー側のMyDataWithInnerdsのみを参照する必要はありません。
MyDataWithInnerdsにシリアル化解除する必要はありません。私は、MyDataWithInnerdsインスタンスをMyDataインスタンスにクローンする必要があると推測しています。そのため、MyDataWithInnerdsに関連付けられた型情報はありませんが、これを行う必要はなく、シリアライザに知らせておくと効率的です「私は、これはMyDataWithInnerdsですけど、あなただけのベースのMyDataのように扱うことができます」私は私の設定ファイルに以下を追加することができました
おかげで、 マイク
EDIT
をサーバー:
<system.runtime.serialization>
<dataContractSerializer>
<declaredTypes>
<add type="MyClientLib.MyData, MyClientLib">
<knownType type="MyServerLib.MyDataWithInnerds, MyServerLib"/>
</add>
</declaredTypes>
</dataContractSerializer>
</system.runtime.serialization>
これにより、シリアル化が正しく機能します。
それはちょうど2つの側面からの質問を残し:私のJSONのシリアライズで
- 、私は、派生クラス型を含む「__type」メンバーで終わります。それを取り除くことはできますか?
- サーバーオブジェクト(MyDataではない)、設定(KnownTypeの追加)で行ったことを宣言的に行う方法はありますか?
Thanks2、 マイク
代替ソリューションについては、[link](http:// stackoverflow。com/questions/4140920/how-to-serialize-a-derived-type-as-its-base-type-with-wcf)を参照してください。 – Suncat2000