2012-02-08 14 views
1

のための基本クラスとして派生クラスの治療:私は派生を作成し、サーバー側のアセンブリで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のシリアライズで

  1. 、私は、派生クラス型を含む「__type」メンバーで終わります。それを取り除くことはできますか?
  2. サーバーオブジェクト(MyDataではない)、設定(KnownTypeの追加)で行ったことを宣言的に行う方法はありますか?

Thanks2、 マイク

答えて

1

最後に、私は、基本クラスのコピーコンストラクタを作成し、代わりに(基底クラスなど)派生クラスを返すので、私は新しいベース(派生)を返します。

[DataContract] 
public class MyData 
{ 
    [DataMember] 
    public string AwesomeData { get; set; } 

    public MyData(MyData obj) 
    { 
     AwesomeData = obj.AwesomeData; 
    } 
} 

サービスの実装は、その後、次のようになります。単純な例では

public class MyDataService: IMyDataService 
{ 
    public MyData GetAwesomeData() 
    { 
    MyDataWithInnerds data = 
     new MyDataWithInnerds(HupnerRayvakManager.GetInitializationStuff()); 
    return new MyData(data); 
    } 
} 

それはやり過ぎのように見えますが、実際のアプリケーションでは、それがちゃんとうまくいく - 余分な構成を有すると無関係のシリアル化された発光ないことなく、データ。

+1

代替ソリューションについては、[link](http:// stackoverflow。com/questions/4140920/how-to-serialize-a-derived-type-as-its-base-type-with-wcf)を参照してください。 – Suncat2000

関連する問題