4

[DataContract] クラスの 1 つに、リストである [DataMember] が含まれています。BaseClass にはいくつかの異なるサブクラスがあります。

そのリストにサブクラスのインスタンスが含まれている場合は常に、サービスがリクエスト チャネルに戻っている間/後に例外が発生します。リストにサブクラスが含まれていない場合は、正常に機能します。

これが私のコードの例です(それ自体は機能しません):

public class BaseClass
{
}
public class BaseClassSub : BaseClass
{
}

[DataContract]
public class MyClass
{
    List<BaseClass> m_Classes = new List<BaseClass>();

    [DataMember]
    public List<BaseClass> Classes
    {
        get { return m_Classes; }
        set { m_Classes = value; }
    }
}


[ServiceContract]
public interface IMyService
{
    [OperationContract]
    MyClass GetMyClass();   

}

public class MyService : IMyService
{
    public MyClass GetMyClass()
    {
        MyClass o = new MyClass();

        //THIS WORKS!!!!
        //o.Classes = new List<BaseClass>() { new BaseClass() };

        //THIS DOES NOT WORK!!!!
        o.Classes = new List<BaseClass>() { new BaseClassSub() };

        return o;
    }
}

デバッグ時に次のエラーが発生します。

ソケット接続が中止されました。これは、メッセージの処理中にエラーが発生したか、リモート ホストが受信タイムアウトを超過したか、基になるネットワーク リソースの問題が原因である可能性があります。ローカル ソケットのタイムアウトは「00:00:59.6560000」でした。

この問題を解決する方法を知っている人はいますか (サブクラスを処理するようにする)?

4

3 に答える 3

4

データ コントラクト シリアライザーに、遭遇する可能性のある型を伝える必要があります。データ コントラクトの既知の型を参照してください。

于 2009-08-03T04:03:03.527 に答える
0

DataContrat 逆シリアル化はコンストラクターを呼び出さず、メンバーの初期値は割り当てられません

これは、デシリアライズ後に m_Classes が null になることを意味します。OnDeserialize イベントまたはゲッターでリストを作成することにより、コードでこれをカバーしてください。

于 2009-12-28T18:11:40.730 に答える
0

さらに検索した後、先に進み、[KnownType] 属性を BaseClass に配置しました (以下を参照)。これは現在機能しています。

[KnownType(typeof(BaseClassSub))]
public class BaseClass
{
}

これが少なくとも他の人に役立つことを願っています!

于 2009-08-03T04:08:16.247 に答える