使用WCF和DataContractSerializer时出错

Asked
Viewd1530

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,将其添加到下一个属性并在其中引发相同的异常,那就是,在击中该属性并死亡之前,它会通过具有相同代码的其他属性进入,所以我不这样做不知道可能是什么问题。

任何人都有真正错误所在的经验,因为没有在异常中填写属性名称和类型,因此似乎错误必须是其他错误。如果我只是在客户端上创建一个新实例,那么我可以反序列化和序列化任何问题,因此这里肯定缺少某些东西。对寻找什么有任何想法吗?

编辑

我实际上只是在这样做:

  1. 创建实例
  2. 序列化
  3. 反序列化
  4. 重新序列化
    1. 在这里死
  • 是的,完全跳过WCF,这就是发生的事情,这是序列化问题。

    NickNovember 13, 2009 21:04
  • 那么这在序列化过程中会在客户端爆炸吗?

    scmccartNovember 13, 2009 20:41

3 个答案

1

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

  • 您可以将其添加到说明中并指出它已解决吗?对于像我这样的人来寻找答案的人,这将有所帮助。另外,我在此处(http://endlessobsession.com/2010/07/12/datacontractserializer-serialization-error/)发表有关同一问题的文章,并描述了一种稍有不同的情况。

    Bryan MatthewsJuly 13, 2010 01:02
1

我假设“汇总”是您班上的一个列表。

如果您的类构造函数未创建“聚合”列表,则在您尝试向其添加项目时为null。

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

编辑

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

  • 它不为空,我什至尝试添加一个OnDeserialized方法,该方法确实会被调用来检查这些东西

    NickNovember 13, 2009 20:19
  • 要删除任何其他变量,我有一个单元测试,该单元测试创建一个新实例并直接使用DataContractSerializer进行序列化,反序列化和重新序列化。第三步是死亡。我敢肯定,这个物件或设定器中发生了一些混乱。但是我需要找出哪里。

    NickNovember 13, 2009 20:57
  • 错误警报,好像我只是在两次重新序列化文件时犯了一个错误,所以它附加到……仍然是原始错误

    NickNovember 13, 2009 21:15
0

如果您的设置者是受保护的或私有的,您可能会看到此信息。如果未标记为公开,则序列化程序将无法进行设置。您如何暴露汇总集合?

  • 聚合是公共列表。这是在序列化过程中发生的,我已将其追溯到从属性返回对象然后呕吐的地步。如果我只尝试序列化该属性,它将正常工作。

    NickNovember 16, 2009 20:05