22

WCFで抽象クラスのDataContractを定義するにはどうすればよいですか?

WCFを使用して正常に通信するクラス「Person」があります。次に、Personから参照される新しいクラス「Foo」を追加します。すべてまだ良いです。しかし、Fooを抽象化し、代わりにサブクラスを定義すると、失敗します。サーバー側ではCommunicationExceptionで失敗しますが、それはあまりわかりません。

テスト用に作成された簡略化されたクラス:

[DataContract]
public class Person
{
    public Person()
    {
        SomeFoo = new Bar { Id = 7, BaseText = "base", SubText = "sub" };
    }

    [DataMember]
    public int Id { get; set; }

    [DataMember]
    public Foo SomeFoo { get; set; }
}

[DataContract]
public abstract class Foo
{
    [DataMember]
    public int Id { get; set; }

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

[DataContract]
public class Bar : Foo
{
    [DataMember]
    public string SubText { get; set; }
}
4

2 に答える 2

34

私はそれを考え出した。「KnownType」を使用して、抽象基本クラスのサブクラスを指定する必要があります。解決策は、これを Foo クラスに追加することです。

[DataContract]
[KnownType(typeof(Bar))] // <------ added
public abstract class Foo
{
    [DataMember]
    public int Id { get; set; }

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

このリンクをチェックしてください。

于 2010-06-23T13:01:43.817 に答える
2

面白い。

Person抽象クラスを直接インスタンス化できないため、コンストラクターでコードが失敗することが予想されます。

于 2010-06-23T12:59:59.313 に答える