3

重複の可能性:
C# WCF: KnownType 属性を使用するのが適切なのはいつですか?

少し前まで、プロジェクトの一部としてクラスで C# Web クライアントを作成する必要がありました。教師はDataContract、合格する各クラスの上に属性を配置するように指示しました。

すると先生は、もしあなたがこのようなものを持っているなら、私たちにこう言いました:

               あ
              / \
             / \
            紀元前

クラス A を次のように記述する必要があります。

[DataContract]
[KnownType(typeof(B))]
[KnownType(typeof(C))]
public class A
{
}

これはポリモーフィズムの考え方に完全に反するものではないでしょうか。クラスを継承する人をクラスが知っている必要があるのはなぜですか?

4

3 に答える 3

4

これは、C# やポリモーフィズムとはまったく関係ありません。むしろシリアライズで。WCF インフラストラクチャは、ネットワークからバイト配列のようなものを取り出し、そこからオブジェクトを作成できる必要があります。クラスAabstract型の場合、そのオブジェクトをインスタンス化する方法はありません。フレームワークは、メタデータを検査して適切なタイプのオブジェクトをインスタンス化できるように、ネットワーク経由で受け取る可能性のあるタイプを知る必要があります。

別の言い方をすれば、属性はその継承者についてクラスに何も伝えません (実際、リストにすべての継承者を含める必要はありません)。これは厳密に、フレームワークが構築を要求されることが期待できる型を知るためです。

DataContractただし、 andDataMember属性の追加は必ずしも必要ではないことを付け加えておきます。これらは、シリアル化からパブリック プロパティを除外するなど、よりきめ細かい制御が必要なシナリオで使用できます。通常、型がシリアライズ可能な場合、属性なしで渡すことができます。

于 2012-10-10T15:46:15.830 に答える
1

WCF シリアライザーは、継承の概念をポリモーフィズムの概念から分離します。CLR の継承は、シリアライザーに関する限り、基本クラスのメンバーが派生クラスに自動的に追加されることを意味するだけであり、XML ドキュメント内の 2 つの要素間に何らかの関係があることを意味するものではありません。ポリモーフィズムを取得するには、派生クラスの XML 表現が基本クラスの XML 表現に置き換え可能であることをシリアライザーに明示的に伝える必要があります。

個人的には区別が便利だと思います。KnownTypeクラス間のビジネス関係を示唆することなく、クラスに共通のプロパティを追加せずに CLR 継承を使用することがあります。

于 2012-10-10T15:49:48.110 に答える
0

まず第一に、ダニエルが言うように、あなたは Web ではなく Windows Communication Fundation (WCF) について話しているのです。

クラスを装飾することで、クラス「A」を使用するために知っておく必要がある 2 つのクラスがあることをクライアントに伝えます。たとえば、

[DataContract]
[KnownType(typeof(B))]
[KnownType(typeof(C))]
public class A
{
    [DataMember] 
    private SuperClass myProp;
}

public Class B : SuperClass  {}
public Class C : SuperClass  {}

詳細については、次のリンクを確認してください: MSDN DataContract

于 2012-10-10T16:01:49.660 に答える