【问题标题】:WCF private member reference in DataContract class becomes NULLDataContract 类中的 WCF 私有成员引用变为 NULL
【发布时间】:2012-04-16 11:01:12
【问题描述】:

我在 Web 服务层的 WCF 中有一个特殊问题。

当我在 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.
            }
        }
    }       
}

【问题讨论】:

  • 所有的实例化和使用RemoteWagon 类是发生在单个 WCF 调用的上下文中,还是跨多个调用?
  • 在您检查的两次之间,RemoteWagon 的实例是否已通过线路从客户端发送到服务器?基本上,WCF 将序列化一个类的公共形状——所有标记有[DataMember] 属性的东西。其他任何东西都将不会通过网络传输,因此在通信链路的另一端将不可用。

标签: c# wcf web-services private datacontract


【解决方案1】:

如果您的类已经被 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] 属性

【讨论】:

    【解决方案2】:

    看来,如果您希望 _Wagon 序列化,您应该将其标记为 DataMember 并放弃其上的“只读”。如果您不希望它序列化,请向我们展示您构建和填充此对象的代码。

    【讨论】:

      猜你喜欢
      • 2011-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-07
      • 2015-11-15
      • 2011-08-17
      • 1970-01-01
      相关资源
      最近更新 更多