2012-04-02 66 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序列化,你应该将其标记为数据成员和沟“只读”就可以了。如果你不想它序列化,请向我们展示你的代码来构造和填充这个对象。