2009-11-13 77 views
1

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

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

它没有给我任何关于二传手的信息我被认为是失踪了,尽管我已经试过寻找遗漏的二传手的继承层次结构,但是我不能似乎通过了这一点。 MyObject是我试图序列化的对象上的一种属性,这里是有趣的部分。在二传手该财产,我有一些代码,看起来像这样:

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

如果我注释掉Aggregates.Add它进入到下一个属性,并抛出了同样的异常那里,踢球的是,它得到的经过其他属性使用相同的代码,在它遇到这个并且死亡之前,所以我不知道这个问题会是什么。

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

编辑

我从字面上做只有这个:

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

因此,在序列化过程中,客户端会发生这种情况吗? – scmccart 2009-11-13 20:41:39

+0

是的,完全跳过WCF,这就是发生了什么,这是一个序列化问题。 – Nick 2009-11-13 21:04:41

回答

1

好吧,算出来。最后一位开发人员在DataMember属性上设置了Order属性。它是错误消息中导致问题的属性之前的属性。我在课堂上错过了一些只读属性。

+0

您可以将此添加到说明并表明它已解决?这对于像我这样的人来找这个答案是有帮助的。另外,我发布了这里(http://endlessobsession.com/2010/07/12/datacontractserializer-serialization-error/)关于相同的问题,并描述了一个稍微不同的情况。 – 2010-07-13 01:02:40

1

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

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

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

编辑

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

+0

它不为空,我甚至尝试添加一个OnDeserialized方法,它会被调用来检查这些东西 – Nick 2009-11-13 20:19:40

+0

要除去任何额外的变量,我有一个单元测试,它创建一个新实例并直接使用DataContractSerializer来序列化,反序列化和重新序列。第三步是死亡。我确定这个东西里面发生了一些事情,或者是一个搞砸了它的setter。但我需要找出在哪里。 – Nick 2009-11-13 20:57:52

+0

我的确遇到了不同的错误,请参阅编辑的问题。 – Nick 2009-11-13 20:58:36

0

如果你的setter是受保护的或私人的,你可能会看到这个。如果未标记为公共,串行器将无法设置它。你如何让你的Aggregates集合被暴露?

+0

聚合是一个公开名单。这发生在序列化上,我将它追踪到它从属性返回对象然后扑灭的地步。如果我尝试序列化只是该属性,它工作正常。 – Nick 2009-11-16 20:05:48