如何找到ASP.NET中的哪个对象无法序列化?

时间:2009-11-20 19:53:25

标签: .net asp.net asp.net-mvc session serialization

我的应用程序中出现以下错误:

  

无法序列化会话状态。   在'StateServer'和'SQLServer'模式下,   ASP.NET将序列化会话   状态对象,因此   不可序列化的对象或   MarshalByRef对象不是   允许的。同样的限制   适用于类似的序列化   由自定义会话状态存储完成   在“自定义”模式下。

堆栈跟踪未提供有关哪个对象无法序列化的任何有用信息。有没有找到问题孩子的好方法?

编辑: 我发现了这个问题,我试图序列化Linq语句(未执行)。但我会尝试选择一个最能解决这个问题的答案。

5 个答案:

答案 0 :(得分:5)

实际上,您应该主要存储自己的状态数据/对象(理想情况下建模为DTO类),在这种情况下答案是:任何标记为{ {1}}或[Serializable]。您不应该将原始UI控件或其他未知对象添加到会话状态。特别是出于like this的原因,前几天对应用程序产生了重大的性能影响。

答案 1 :(得分:2)

MbUnit(现在是Gallio)有一个Assert.IsSerializable()测试,可以在这里派上用场。

答案 2 :(得分:1)

您可以尝试序列化对象,并检查当它不可序列化时抛出的System.Runtime.Serialization.SerializationException。它应该告诉你哪个成员或父对象不能被序列化。

示例代码:

var f = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
f.Serialize(new System.IO.MemoryStream(), yourObject);

答案 3 :(得分:0)

在类似的情况下我能做的最好的事情是查看Session引用的每个对象,并检查它是否存在Serializable属性(或者该对象实现了ISerialzable接口)。

答案 4 :(得分:0)

您可以通过.net框架代码调试找到触发序列化异常的罪魁祸首类型。至少那是我做的。