为什么InProc会话模式不需要序列化

时间:2015-06-10 08:33:14

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

我正在使用state service session provider作为我的mvc应用程序,如果我没有序列化我要在会话中存储的类型,应用程序会抛出一个错误,该类必须标记为Serializable。但是,如果我切换到InProc会话模式,即使我的类没有标记为Serializable,会话仍然有效。根据我的理解,即使在InProc模式的情况下,ASP.Net在存储在会话之前序列化数据,那么为什么InProc模式在不使用Serializable属性的情况下工作。

2 个答案:

答案 0 :(得分:7)

使用InProc会话,数据不会“存储”在任何地方,只会保留在内存中。这样就不需要序列化了。对于其他方法,数据确实需要写入某个地方(状态服务器,sql服务器),需要转换为字节流(然后再返回)。

因此,如果您使用InProc并拥有大量包含大量数据的会话,则可能会耗尽服务器内存。

答案 1 :(得分:3)

InProc没有序列化。

In-Proc Session State Management

  

InProc状态比状态服务器或SQL Server会话存储技术快得多。 SQL Server和状态服务器将它们在从SQL /状态服务器读取/存储会话数据时发生的序列化/反序列化的速度很慢。

InProc Mode in ASP.NET Session State

  

序列化/反序列化是潜在的问题。 InProc不需要复杂对象的序列化。这基本上是有利的,但实际上可能是你最不期望的大问题。由于InProc允许在会话中放置任何内容,因此在会话中最终可能会有许多不可序列化的对象。如果您需要稍后切换到会话状态或SQL Server(例如,您的网站变得流行,现在您有许多访问者),则不能,因为存储的类不可序列化。突然之间看起来像是有利的东西成了问题,你必须立刻改变所有有问题的对象。