无法序列化会话状态“System.Web.SessionState.HttpSessionState”

问题描述

出现“无法序列化会话状态”错误,我试图在会话中存储 HttpSessionState 对象。以下是我的代码,导致问题。由于 HttpSessionState 不是可序列化的类并试图放入会话。

Public Shared Property CurrentSession As HttpSessionState
    Get
        Return TryCast(HttpContext.Current.Session("CurrentSessionObject"),HttpSessionState)
    End Get
    Set(value As HttpSessionState)
        HttpContext.Current.Session("CurrentSessionObject") = value
    End Set
End Property

“/”应用程序中的服务器错误

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

描述:在执行当前 Web 请求期间发生了未处理的异常。请查看堆栈跟踪以了解有关错误及其在代码中的来源的更多信息。

异常详细信息:System.Web.HttpException:无法序列化会话状态。在“StateServer”和“sqlServer”模式下,ASP.NET 将序列化会话状态对象,因此不允许使用不可序列化的对象或 MarshalByRef 对象。如果自定义会话状态存储在“自定义”模式下完成类似的序列化,则同样的限制适用。

错误

在执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常来源和位置的信息。

堆栈跟踪:

[SerializationException:在程序集“System.Web”中输入“System.Web.SessionState.HttpSessionState”,版本=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a'未标记为可序列化。 ] System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType 类型) +12672675 System.Runtime.Serialization.c__displayClass9_0.b__0(MemberHolder _) +42 System.Collections.Concurrent.ConcurrentDictionary2.GetorAdd(TKey key,Func2 valueFactory) +73 System.Runtime.Serialization.FormatterServices.GetSerializableMembers(类型类型,StreamingContext 上下文)+186 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo() +166 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Object obj,ISurrogateSelector surrogateSelector,StreamingContext context,SerObjectInfoInit serObjectInfoInit,IFormatterConverter 转换器,ObjectWriter objectWriter,SerializationBinder binder) +187 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.Serialize(Object obj,SerializationBinder binder) +53 System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph,Header[] inHeaders,__BinaryWriter serWriter,Boolean fCheck) +571 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream,Object graph,Header[] headers,Boolean fCheck) +137 System.Web.Util.AltSerialization.WriteValuetoStream(Object value,BinaryWriter writer) +1644

[HttpException (0x80004005): 无法序列化会话状态。在“StateServer”和“sqlServer”模式下,ASP.NET 将序列化会话状态对象,因此不允许使用不可序列化的对象或 MarshalByRef 对象。如果自定义会话状态存储在“自定义”模式下完成类似的序列化,则同样的限制适用。] System.Web.Util.AltSerialization.WriteValuetoStream(Object value,BinaryWriter writer) +1733 System.Web.SessionState.SessionStateItemCollection.WriteValuetoStreamWithAssert(Object value,BinaryWriter writer) +36 System.Web.SessionState.SessionStateItemCollection.Serialize(BinaryWriter writer) +652 System.Web.SessionState.SessionStateUtility.Serialize(SessionStateStoreData item,Stream stream) +246 System.Web.SessionState.SessionStateUtility.SerializeStoreData(SessionStateStoreData item,Int32 initialStreamSize,Byte[]& buf,Int32& length,Boolean compressionEnabled) +65 System.Web.SessionState.sqlSessionStateStore.SetAndReleaseItemExclusive(HttpContext context,String id,SessionStateStoreData item,Object lockId,Boolean newItem) +138 System.Web.SessionState.SessionStateModule.OnReleaseState(Object source,EventArgs eventArgs) +589 System.Web.SessionState.SessionStateModule.OnEndRequest(Object source,EventArgs eventArgs) +9947060 System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +144 System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep step) +50 System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean&completedSynchronously) +73

解决方法

您需要使用 [Serializable] 属性将推送到 SessionState 的类型标记为可序列化。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...