2012-04-02 67 views
4

我在Web服務層的WCF中存在一個問題。DataContract類中的WCF私有成員引用變爲NULL

當我在WCF中實例化我的類的私有成員(_Wagon)(此實例化不爲空)時,幾秒鐘後,它變爲空。

我一直在嘗試診斷問題,但目前爲止沒有結果。

因此,我正在轉向你們的人來幫助我解決這個問題。

謝謝。

因此,有我的代碼:

[DataContract] 
public class RemoteWagon 
{ 
    private readonly IWagon _Wagon; 

    public RemoteWagon(IWagon Wagon) 
    { 
     _Wagon = Wagon; //_Wagon isn't null here 
    } 

    ~RemoteWagon() 
    { 
     Trace.WriteLine("Do nothing"); 
    }  

    [DataMember] 
    public RemoteBreakpoint Breakpoint 
    { 
     set 
     { 
      if (value == null) 
      { 
       _Wagon.Breakpoint = null; //_Wagon member is NULL... 
      } 
      else 
      { 
       //... useless code in this context. 
      } 
     } 
    }  
} 
+0

是所有的實例,並與'RemoteWagon'類發生一個WCF調用的環境中工作,或在多個電話? – mellamokb 2012-04-02 19:24:39

+1

「RemoteWagon」的實例是否在您檢查兩次之間從客戶端到服務器的線路上發送?基本上,WCF將只**串行化一個類的**公共形狀** - 所有用'[DataMember]'屬性標記的東西。其他任何事情都不會**通過電線傳輸,因此在通信鏈路的另一側將不可用。 – 2012-04-02 19:27:15

回答

2

如果你的類被序列化和DataContractSerializer的反序列化就會發生這種情況(例如發送客戶端和服務器之間的數據時)

一些參考:DataContractSerializer doesn't call my constructor?

如果是這種情況,那麼一個可能的解決方案,這爲我工作:https://stackoverflow.com/a/9419943/724944

因此快速檢查&修復了這個問題(我假設你想自己初始化場,而不是序列化)是創建方法:

[OnDeserializing] 
private void OnDeserializing(StreamingContext c) 
{ 
    _Wagon = initializeWagon(); 
} 

然而,正如您可能已經注意到的那樣,您將無法在反序列化過程中傳遞Wagon - 您必須以不同的方式初始化它。

在另一方面,如果你想_Wagon序列化,然後將其暴露爲public [DataMember]財產

1

看來,如果你想_Wagon序列化,你應該將其標記爲數據成員和溝「只讀」就可以了。如果你不想它序列化,請向我們展示你的代碼來構造和填充這個對象。