質問

MSDNリファレンスを読んだ後、既知の属性をいつ使用するかについて質問があります。属性はタイプ情報をシリアルに通信することを理解していますが、これはいつ必要ですか?シリアル化されているクラスに基本クラスのタイプの参照があり、それらの参照に設定できるアップキャストデリバティブクラスがある場合、それは適切ですか?

さらに、属性を過剰に使用するための欠点はありますか?たとえば、前の例では、そのタイプへの明示的な参照があるにもかかわらず、シリアル化クラスに既知のタイプ(Baseclass)がマークされた場合は?

役に立ちましたか?

解決

[KnownType] サブタイプについて伝えるには必要です。の欠点 いいえ それを使用することは、次のものが機能しないことです。

[DataContract]
class Foo {}

[DataContract]
class Bar : Foo {}

WCFインターフェイスのメソッドを使用して、

public Foo GetFoo() { return new Bar(); }

属性なしでは、シリアイザー(特にMEX/プロキシ生成タイプ用) 知りません Bar, 、そしてそれは失敗します。属性で:

[DataContract, KnownType(typeof(Bar))]
class Foo {}

それ 意思 仕事。これはにのみ適用されます DataContractSerializer - と NetDataContractSerializer タイプデータを別の方法で取得します。

他のヒント

スキーマでXSD「継承」を使用している場合。

あなたはそれを後方に持っています。既知のTypeattributeは基本クラスに適用され、ベースへの参照として渡される可能性のある派生クラスのすべてに名前を付けます。

例えば:

...
KnownType(typeof(POBoxAddress))
KnownType(typeof(StreetAddress))
KnownType(typeof(SingleLineAddress))
KnownType(typeof(ParsedAddress))
public abstract class AddressBase
{
    ...
}

インターフェイスやベースクラスなどの非コンクリートタイプをシリアル化している場合、既知のタイプの属性が必要です。 WCFシリアナーは、インターフェイスまたは継承クラスのすべての可能な実装について知っている必要があります。それが知らない実装は、シリアル化例外を引き起こします。

これには、1つの可能性のある使用法が見つかります だから質問

また、以下のようなケースにも役立ちます。

[DataContract]
[knownType(typeof(Person))]
public class KeyValue
{
  [DataMember]
  public string key {get; set;}

  [DataMember]
  public string value {get; set;}

  // rest of the code
}

ここで、価値が他のクラスのことを言う人の何らかのオブジェクトが含まれていると仮定します。その後、これはすべて既知のタイプ(typeof(person))を追加する必要があります

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top