我的应用程序中出现以下错误:
无法序列化会话状态。 在'StateServer'和'SQLServer'模式下, ASP.NET将序列化会话 状态对象,因此 不可序列化的对象或 MarshalByRef对象不是 允许的。同样的限制 适用于类似的序列化 由自定义会话状态存储完成 在“自定义”模式下。
堆栈跟踪未提供有关哪个对象无法序列化的任何有用信息。有没有找到问题孩子的好方法?
编辑: 我发现了这个问题,我试图序列化Linq语句(未执行)。但我会尝试选择一个最能解决这个问题的答案。
答案 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框架代码调试找到触发序列化异常的罪魁祸首类型。至少那是我做的。