【问题标题】:serializing session state in asp.net在 asp.net 中序列化会话状态
【发布时间】:2012-05-01 03:11:36
【问题描述】:

我试图在我们的 nopcommerce 1.9 安装中将会话状态存储在 SQL 而不是 InProc 中。当我对 web.config 进行必要的更改时,我收到此错误:

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

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

描述:执行过程中发生了未处理的异常 当前的网络请求。请查看堆栈跟踪以获取更多信息 有关错误的信息以及它在代码中的来源。

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

来源错误:

在执行过程中产生了一个未处理的异常 当前的网络请求。有关原产地和位置的信息 可以使用下面的异常堆栈跟踪来识别异常。

堆栈跟踪:

[序列化异常:类型 'NopSolutions.NopCommerce.BusinessLogic.Categories.Category' 在 程序集'Nop.BusinessLogic,版本=1.9.0.0,文化=中性, PublicKeyToken=null' 未标记为可序列化。]
System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType 类型)+9449041
System.Runtime.Serialization.FormatterServices.GetSerializableMembers(类型 类型,StreamingContext 上下文)+247
System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo() +160 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(类型 objectType, ISurrogateSelector surrogateSelector, StreamingContext 上下文,SerObjectInfoInit serObjectInfoInit,IFormatterConverter 转换器,SerializationBinder 活页夹)+371
System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteArray(WriteObjectInfo objectInfo、NameInfo memberNameInfo、WriteObjectInfo memberObjectInfo) +205 System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write(WriteObjectInfo objectInfo, NameInfo memberNameInfo, NameInfo typeNameInfo) +651
System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(对象 图,Header[] inHeaders,__BinaryWriter serWriter,布尔 fCheck) +444 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(流 序列化流、对象图、Header[] 标头、布尔 fCheck) +133 System.Web.Util.AltSerialization.WriteValueToStream(Object value, BinaryWriter writer) +1762

[HttpException (0x80004005): 无法序列化会话状态。在 'StateServer' 和 'SQLServer' 模式,ASP.NET 将序列化会话 状态对象,结果是不可序列化的对象或 不允许 MarshalByRef 对象。同样的限制适用 如果类似的序列化由自定义会话状态存储完成 “自定义”模式。]
System.Web.Util.AltSerialization.WriteValueToStream(对象值, BinaryWriter 作家)+1847
System.Web.SessionState.SessionStateItemCollection.WriteValueToStreamWithAssert(对象 值,BinaryWriter 写入器)+34
System.Web.SessionState.SessionStateItemCollection.Serialize(BinaryWriter 作家)+638
System.Web.SessionState.SessionStateUtility.Serialize(SessionStateStoreData 项目,流流)+244
System.Web.SessionState.SessionStateUtility.SerializeStoreData(SessionStateStoreData item, Int32 initialStreamSize, Byte[]& buf, Int32& length, Boolean 压缩启用)+67
System.Web.SessionState.SqlSessionStateStore.SetAndReleaseItemExclusive(HttpContext 上下文、字符串 id、SessionStateStoreData 项、对象 lockId、布尔值 新项目)+140
System.Web.SessionState.SessionStateModule.OnReleaseState(对象 源,EventArgs eventArgs) +807
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +148 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75

版本信息:Microsoft .NET Framework 版本:4.0.30319; ASP.NET 版本:4.0.30319.272

请告诉我,我不需要序列化 ​​Nopcommerce 中的每个对象来执行此操作!

【问题讨论】:

    标签: c# asp.net serialization session-state nopcommerce


    【解决方案1】:

    正如例外所说的你的类型

    NopSolutions.NopCommerce.BusinessLogic.Categories.Category

    不可序列化。我不知道该类型的实现,但您可以尝试使用 [Serializable] 属性来装饰该类型。

    如果你不能这样做,你可以简单地将对象的 id 写入你的会话。

    如果您希望将会话存储在 sql server 中,则写入会话中的每个对象都需要可序列化。

    更多信息

    【讨论】:

    • 感谢您的回复,我如何将对象的 id 写入我的会话,例如,如果我有类我想序列化我如何将该类 id 写入我的会话?提前致谢
    【解决方案2】:

    添加[Serializable] 属性(VB 中的<Serializable()>)自动使您的类可序列化。您班级中的所有成员也需要可序列化。所以假设你的类中有对象引用。那么这些对象所属的类也需要具有[Serializable] 属性。基本类型是自动序列化的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-01
      • 2012-05-07
      • 2013-09-24
      相关资源
      最近更新 更多