1

我有一个相当复杂的对象模型,我正在尝试使用 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. 死在这里
4

3 回答 3

1

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

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

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

编辑

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

于 2009-11-13T20:15:10.363 回答
1

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

于 2009-11-17T14:22:53.330 回答
0

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

于 2009-11-14T16:40:07.490 回答