DataContractと継承?

継承でDataContractを使用するには?以下のコードは機能しますか?

[DataContract]
public class ConsoleData
{
    [DataMember]
    public String Description { get; set; }

}

[DataContract]
public class SomeData : ConsoleData
{

    [DataMember]
    public int Volume { get; set; }
    ......
23
はい。あなたはこれら2つのデータ契約で何をしようとしていますか?
追加された 著者 marc_s,

2 答え

はい、それはうまくいくでしょう。

DataContractAttribute には Inherited がfalseに設定されているので、子クラスと親クラスの両方に属性を適用する必要があります。


You would need to use the KnownType attribute if you want to use your data contracts with polymorphism.

例えば

 [ServiceContract]
 interface MyWcfContract
 {
       [OperationContract]
       HandleData(ConsoleData contractData);
 }

このようにメソッドを呼び出すと:

 SomeData someData = new SomeData { Description = "Test", Volume = 30 };
//The method is expecting a ConsoleData instance, 
//I'm passing a SomeData instance instead
 myWcfProxy.HandleData(someData);

サービス側のデシリアライザは、それが期待していた ConsoleData のインスタンスである SomeData のインスタンスであることを認識しません。  これを修正する方法は、 SomeData クラスを ConsoleData の既知のタイプとして登録することです。

[DataContract]
[KnownType(typeof(SomeData))]
public class ConsoleData
{
    [DataMember]
    public String Description { get; set; }

}

[DataContract]
public class SomeData : ConsoleData
{

    [DataMember]
    public int Volume { get; set; }
    ......
37
追加された
ありがとう、本当に助けて私の問題を修正
追加された 著者 javapowered,
@ Shanjeeありがとう、私は余分な括弧を追加しました。誰かが気づくのに7年かかった:-)
追加された 著者 Andrew Shepherd,
@Andrew。私はこれらの主題で長い間戦っています。 Base からSoapUIからdrievedオブジェクトを送信することは可能ですか?そして、もしc#が base にあるサブクラスのインスタンスを保持していることを知っているなら、適切なメソッドも呼び出す(多態性など)
追加された 著者 user6023611,
[KnownType(typeData)]に多少の構文エラーがありました。役立つポストに感謝します。
追加された 著者 Shanjee,

ServiceContractにXmlSerializerFormatを使用する場合は、KnownType属性を使用する必要があります。

[DataContract]
public class ConsoleData
{
    [DataMember]
    public String Description { get; set; }
}

[DataContract, KnownType(typeof(ConsoleData))]
public class SomeData : ConsoleData
{
    [DataMember]
    public int Volume { get; set; }
}
2
追加された
KnownType なしではうまくいかないでしょうか?私は記述で書いたようにコードを試してみたが、うまくいくようだ
追加された 著者 javapowered,
私はこれに質問します。 KnownType(typeof(SomeData))を基本クラス(ConsoleData)に配置すると、基本インスタンスが必要なメソッドに子インスタンスを渡すことができます。しかし、私はあなたが子供のインスタンスに配置する必要はないと思う。
追加された 著者 Andrew Shepherd,
@ M.Babcock - ここで駄目にして申し訳ありません:私が試している場合は、KnownType属性は必要ありません。 KnownType属性が実際に必要な使用例を教えてください。 (つまり、属性なしで動作しないコード)
追加された 著者 Andrew Shepherd,
@javapowered:必要な特殊なケースがあるので、KnownType属性を使用しないことに決めたら、注意してください。そのような例の1つは、SomeDataをさらに別のDataContractのプロパティとして公開する場合です。
追加された 著者 M.Babcock,
@ AndrewShepherd:数週間前に私が試したテストでは、その属性が親子に置かれているのかどうかは関係ありませんでした。
追加された 著者 M.Babcock,
@ AndrewShepherd:私は自分の研究ノートを見直しました。サービス契約でXmlSerializerFormat属性を使用する場合にのみ必要だったようです。
追加された 著者 M.Babcock,
@ M.Babcock。私はこれらの主題で長い間戦っています。 [OperationContract] HandleData(Baseベース)に含めることは可能ですか? SoapUIから Base のオブジェクトをいくつか送信しますか?そして、もしc#が base にあるサブクラスのインスタンスを保持していることを知っているなら、適切なメソッドも呼び出す(多態性など)
追加された 著者 user6023611,