.NET序列化问题

时间:2010-01-14 16:46:12

标签: .net serialization

当我尝试序列化我的一个对象时,我不断收到'类型XXX未标记为可序列化'的异常。这可能听起来很愚蠢,但我的问题是我似乎无法在对象图上找到任何类型XXX对象的引用(使用调试器悬停窗口)。有没有人知道扫描对象图中这种类型的任何东西的好方法?

这是一个复杂的对象图(深度为100级),所以我确定某些地方必须有一个tye XXX的字段,但我找不到。

5 个答案:

答案 0 :(得分:2)

如果异常没有为您提供足够的信息,[XmlIgnore]属性对于追踪罪魁祸首非常有用。

将它扔在您要序列化的对象的所有内容上。然后一次删除一个。当对象不再序列化时,您知道问题在于该属性不可序列化。钻入该类,将其全部标记为[XmlIgnore],然后重复。

最终你会找到它。

答案 1 :(得分:1)

您的任何对象是否来自Type XXX,或者您尝试序列化的类型的任何属性派生自XXX类型?

答案 2 :(得分:1)

同时寻找事件;在遍历对象图时跟踪的事件,如果你有事情连接到那些无法序列化的事件,你将得到这个例外。您可以将事件的支持字段标记为不可序列化以克服此问题:

[field:NonSerializable]
event MyEventHandler MyEvent;

除此之外,如果你发布了课程代码,它可能对我们有帮助。

答案 3 :(得分:1)

您的其他选择实际上是调试序列化代码。这样做的方法是在调用Serialize时调用try / catch,并在catch中设置断点。然后,当抛出异常时,将黄色栏拖到Serialize调用的位置上方的一行,这次,如果知道代码的存储位置,您将能够在序列化代码中设置断点。

那是因为Serialize方法实际上是在第一次运行时生成和编译的。您可以在this blog posting中查看有关如何执行此操作的详细信息。

答案 4 :(得分:0)

您可能会开始检查内部异常的内部异常。通常当我遇到序列化问题时,我会发现有3或4个嵌套的内部异常,然后才发现它是B类的属性A,它是C类中的属性,它位于某个列表中。