【问题标题】:Error using WCF and DataContractSerializer使用 WCF 和 DataContractSerializer 时出错
【发布时间】:2009-11-13 20:06:01
【问题描述】:

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

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

它没有给我任何关于我应该丢失的 setter 的信息,即使我已经尝试通过继承层次结构查找丢失的 setter,我似乎无法通过这个。 MyObject 是我要序列化的对象的一种属性,这是有趣的部分。在该属性的设置器中,我的代码如下所示:

set
{
    _backingField = value;
    _backingField.IsDirtyManager.SetIsDirty();
    NotifyPropertyChanged("MyProperty");
    if (!ContainsType(_backingField.GetType()))
    {
        Aggregates.Add(_backingField);
    }
}

如果我将 Aggregates.Add 注释掉,它会进入下一个属性并在那里抛出相同的异常,更重要的是,它会通过具有相同代码的其他属性,在它遇到这个并死掉之前,所以我不会不知道是什么问题。

任何人都知道真正的错误在哪里,因为属性名称和类型没有在异常中填写,所以看起来错误必须是别的东西。如果我只是在客户端上创建一个新实例,我可以反序列化和序列化没有问题,所以这里肯定有一些我遗漏的东西。关于寻找什么的任何想法?

编辑

我实际上只是这样做:

  1. 创建实例
  2. 序列化
  3. 反序列化
  4. 重新序列化
    1. 死在这里

【问题讨论】:

  • 所以这在序列化期间在客户端爆炸了?
  • 是的,完全跳过 WCF,就是这样,这是一个序列化问题。

标签: wcf serialization datacontractserializer


【解决方案1】:

我假设“聚合”是您班级中的一个列表。

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

这与您遇到的错误不符,但值得检查。

编辑

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

【讨论】:

  • 它不为空,我什至尝试添加一个 OnDeserialized 方法,它确实会被调用来检查这些东西
  • 要删除任何额外的变量,我有一个单元测试,它创建一个新实例并直接使用 DataContractSerializer 来序列化、反序列化和重新序列化。第三步是它死亡的地方。我敢肯定这个对象中发生了一些事情,或者是一个把它搞砸的设置器。但我需要找出在哪里。
  • 误报,看来我只是在两次重新序列化文件时犯了一个错误,所以它附加在...仍然是原始错误
【解决方案2】:

好的,想通了。最后一位开发人员在 DataMember 属性上设置了 Order 属性。导致问题的是错误消息中的属性在属性之前的顺序。我在该课程中错过了几个只读属性。

【讨论】:

  • 你能把这个添加到描述中并表明它已经解决了吗?这对像我这样来这篇文章寻找答案的人很有帮助。另外,我在这里 (endlessobsession.com/2010/07/12/…) 发布了关于相同问题并描述了稍微不同的场景。
【解决方案3】:

如果您的 setter 是受保护的或私有的,您可能会看到这一点。如果它没有标记为公共,则序列化程序将无法设置它。您如何公开您的聚合集合?

【讨论】:

  • 聚合是一个公共列表。这发生在序列化上,我已经追踪到它从属性返回对象然后它吐了。如果我尝试仅序列化该属性,它可以正常工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-30
  • 1970-01-01
  • 2012-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多