代码之家  ›  专栏  ›  技术社区  ›  Yuriy Faktorovich

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

  •  6
  • Yuriy Faktorovich  · 技术社区  · 15 年前

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

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

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

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

    5 回复  |  直到 8 年前
        1
  •  5
  •   Marc Gravell    15 年前

    实际上,您应该主要存储 拥有 状态数据/对象(理想情况下建模为DTO类),在这种情况下,答案是:any 标记为 [Serializable] ISerializable . 您不应该向会话状态添加原始UI控件或其他未知对象。尤其是出于某些原因 like this 这在前几天对一个应用程序产生了重大的性能影响。

        2
  •  2
  •   Wyatt Barnett    15 年前

    MBUnit(现在是Gallio)有一个assert.isserializable()测试,可以在这里使用。

        3
  •  1
  •   Protector one reece    8 年前

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

    示例代码:

    var f = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
    f.Serialize(new System.IO.MemoryStream(), yourObject);
    
        4
  •  0
  •   mfeingold    15 年前

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

        5
  •  0
  •   phabtar    12 年前

    您可以通过.NET框架代码调试找到引发序列化异常的罪犯类型。至少我是这么做的。

    推荐文章