Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用WCF和DataContractSerializer时出错_Wcf_Serialization_Datacontractserializer - Fatal编程技术网

使用WCF和DataContractSerializer时出错

使用WCF和DataContractSerializer时出错,wcf,serialization,datacontractserializer,Wcf,Serialization,Datacontractserializer,我有一个相当复杂的对象模型,我正试图使用WCF序列化它。我遇到了一个问题,我可以在服务器上创建一个新实例并将其返回给客户机,然后尝试传回相同的对象,甚至使用DataContractSerializer对其进行序列化会引发异常 测试方法Server.Service.Test.SerializationTest.TestFilingSerialization引发异常:System.Runtime.Serialization.SerializationException:反序列化MyNameSpace

我有一个相当复杂的对象模型,我正试图使用WCF序列化它。我遇到了一个问题,我可以在服务器上创建一个新实例并将其返回给客户机,然后尝试传回相同的对象,甚至使用DataContractSerializer对其进行序列化会引发异常

测试方法Server.Service.Test.SerializationTest.TestFilingSerialization引发异常:System.Runtime.Serialization.SerializationException:反序列化MyNameSpace.MyObject类型的对象时出错。没有为类型“”中的属性“”设置方法。

它并没有给我任何关于我应该缺少的setter的信息,即使我尝试过在继承层次结构中查找缺少的setter,我似乎还是无法通过这个MyObject是我试图序列化的对象上的一种属性,有趣的是。在该属性的setter中,我有如下代码:

set
{
    _backingField = value;
    _backingField.IsDirtyManager.SetIsDirty();
    NotifyPropertyChanged("MyProperty");
    if (!ContainsType(_backingField.GetType()))
    {
        Aggregates.Add(_backingField);
    }
}
如果我注释掉聚合。Add,它会进入下一个属性,并在那里抛出相同的异常,最关键的是,它会用相同的代码通过其他属性,在它命中这个属性并消失之前,所以我不知道问题可能是什么

任何人都有实际错误发生的经验,因为属性名称和类型没有填写在异常中,所以错误似乎是其他错误。如果我只是在客户机上创建一个新实例,我就可以反序列化和序列化,没有问题,所以这里肯定缺少一些东西。关于找什么有什么想法吗

编辑

我实际上只是这样做:

  • 创建实例
  • 连载
  • 反序列化
  • 重新序列化
  • 死在这里
  • 我假设“聚合”是你们班上的一个列表

    如果您的类构造函数没有创建聚合列表,那么当您尝试向其中添加项时,它将为null

    这与您得到的错误不匹配,但值得检查

    编辑


    在Visual Studio中,进入“工具”->“选项”->“调试”->“常规”取消选中“仅启用我的代码”选项。然后再次运行它,您可能会得到更好的错误消息。

    如果您的setter是受保护的或私有的,您可能会看到此错误消息。如果未标记为public,序列化程序将无法对其进行设置。你如何公开你的聚合集合?

    好的,找到答案。上一个开发人员已在DataMember属性上设置了Order属性。导致问题的是错误消息中顺序在属性之前的属性。在那个类中,我遗漏了几个只读属性。

    它不是空的,我甚至尝试添加一个OnDeserialized方法,该方法会被调用来检查这些内容以删除任何额外的变量。我有一个单元测试,创建一个新实例,并直接使用DataContractSerializer进行序列化,反序列化和重新序列化。第三步是它死亡的地方。我敢肯定这个物体里发生了什么事,或者一个设定器把它搞乱了。但是我需要找出在哪里。假警报,看起来我只是在对文件重新序列化两次时犯了一个错误,所以它附加了…仍然是原始错误,所以在序列化过程中客户端发生了爆炸?是的,跳过WCF,完全是这样,这是一个序列化问题。聚合是一个公共列表。这发生在序列化上,我跟踪到它从属性返回对象的点,然后它呕吐。如果我尝试序列化该属性,它可以正常工作。您可以将其添加到描述中,并指示它已被解析吗?这对像我这样来这篇文章寻找答案的人来说是很有帮助的。另外,我在这里()发布了关于相同问题的文章,并描述了一个稍微不同的场景。