4

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

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

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

说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

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

源错误:

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

堆栈跟踪:

[SerializationException:在程序集'Nop.BusinessLogic,Version = 1.9.0.0,Culture = Neutral,PublicKeyToken = null'中键入'NopSolutions.NopCommerce.BusinessLogic.Categories.Category'未标记为可序列化。]
System.Runtime.Serialization.FormatterServices .InternalGetSerializableMembers(RuntimeType type) +9449041
System.Runtime.Serialization.FormatterServices.GetSerializableMembers(Type 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 转换器, 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(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck) +444 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] 标头,布尔 fCheck)+133 System.Web.Util.AltSerialization.WriteValueToStream(对象值,BinaryWriter writer)+1762

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

4

2 回答 2

11

正如例外所说,您的类型

NopSolutions.NopCommerce.BusinessLogic.Categories.Category

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

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

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

更多信息

于 2012-04-19T15:02:09.310 回答
5

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

于 2012-10-18T09:47:00.913 回答