2009-08-03 9 views
4

[DataContract]クラスの1つにListである[DataMember]が含まれています。 BaseClassにはいくつかの異なるサブクラスがあります。WCF - サブクラスを[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 'でした。

誰でもこの問題を解決する方法を知っています(サブクラスを処理する方法)。

+0

例外について私たちに推測させてください。全体の例外を投稿してください。それをキャッチし、ex.ToString()を投稿してください。 –

答えて

4

データ契約シリアライザに遭遇する可能性があるタイプを伝える必要があります。 Data Contract Known Typesを参照してください。

+0

ありがとう!私が投稿していたときに私はあなたの返事を逃した! –

0

さらに検索した後、[KnownType]属性をBaseClass(下を参照)に入れて、現在動作しています。

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

これが他の人には少なくとも助けてくれることを願っています!

0

DataContratデシリアライゼーションは、コンストラクタを呼び出さないとメンバーの初期値が

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

関連する問題