在asp.net中序列化会话状态

时间:2012-04-19 14:58:37

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

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

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

     

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

     

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

     

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

     

来源错误:

     

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

     

堆栈追踪:

     

[SerializationException:Type   'NopSolutions.NopCommerce.BusinessLogic.Categories.Category'中   Assembly'Nop.BusinessLogic,Version = 1.9.0.0,Culture = neutral,   PublicKeyToken = null'未标记为可序列化。]
  System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType   型号)+9449041
  System.Runtime.Serialization.FormatterServices.GetSerializableMembers(类型   type,StreamingContext context)+247
  System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo()   +160 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Type   objectType,ISurrogateSelector surrogateSelector,StreamingContext   context,SerObjectInfoInit serObjectInfoInit,IFormatterConverter   converter,SerializationBinder binder)+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(对象   graph,Header [] inHeaders,__BinaryWriter serWriter,Boolean fCheck)   +444 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream   serializationStream,Object graph,Header [] headers,Boolean fCheck)   +133 System.Web.Util.AltSerialization.WriteValueToStream(Object value,BinaryWriter writer)+1762

     

[HttpException(0x80004005):无法序列化会话状态。在   在“StateServer”和“SQLServer”模式下,ASP.NET将序列化会话   状态对象,因此不可序列化的对象或   不允许MarshalByRef对象。同样的限制适用   如果类似的序列化由自定义会话状态存储在中完成   '自定义'模式。]
  System.Web.Util.AltSerialization.WriteValueToStream(Object value,   BinaryWriter作者)+1847
  System.Web.SessionState.SessionStateItemCollection.WriteValueToStreamWithAssert(对象   值,BinaryWriter作者)+34
  System.Web.SessionState.SessionStateItemCollection.Serialize(的BinaryWriter   作家)+638
  System.Web.SessionState.SessionStateUtility.Serialize(SessionStateStoreData   item,Stream stream)+244
  System.Web.SessionState.SessionStateUtility.SerializeStoreData(SessionStateStoreData   item,Int32 initialStreamSize,Byte []& buf,Int32&长度,布尔值   compressionEnabled)+67
  System.Web.SessionState.SqlSessionStateStore.SetAndReleaseItemExclusive(HttpContext的   context,String id,SessionStateStoreData item,Object lockId,Boolean   newItem)+140
  System.Web.SessionState.SessionStateModule.OnReleaseState(对象   source,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中的每个对象来执行此操作!

2 个答案:

答案 0 :(得分:9)

正如例外所示

NopSolutions.NopCommerce.BusinessLogic.Categories.Category

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

如果您无法执行此操作,只需将对象的ID写入会话即可。

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

更多信息

答案 1 :(得分:5)

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