C# – serializing session state in asp.net

asp.netcnopcommerceserializationsession-state

I'm trying to store session state in SQL instead of InProc in our nopcommerce 1.9 install. When I make the requisite changes to the web.config I get this error:

Server Error in '/' Application.

Unable to serialize the session state. In 'StateServer' and
'SQLServer' mode, ASP.NET will serialize the session state objects,
and as a result non-serializable objects or MarshalByRef objects are
not permitted. The same restriction applies if similar serialization
is done by the custom session state store in 'Custom' mode.

Description: An unhandled exception occurred during the execution of
the current web request. Please review the stack trace for more
information about the error and where it originated in the code.

Exception Details: System.Web.HttpException: Unable to serialize the
session state. In 'StateServer' and 'SQLServer' mode, ASP.NET will
serialize the session state objects, and as a result non-serializable
objects or MarshalByRef objects are not permitted. The same
restriction applies if similar serialization is done by the custom
session state store in 'Custom' mode.

Source Error:

An unhandled exception was generated during the execution of the
current web request. Information regarding the origin and location of
the exception can be identified using the exception stack trace below.

Stack Trace:

[SerializationException: Type
'NopSolutions.NopCommerce.BusinessLogic.Categories.Category' in
Assembly 'Nop.BusinessLogic, Version=1.9.0.0, Culture=neutral,
PublicKeyToken=null' is not marked as serializable.]
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
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(Object
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): Unable to serialize the session state. In
'StateServer' and 'SQLServer' mode, ASP.NET will serialize the session
state objects, and as a result non-serializable objects or
MarshalByRef objects are not permitted. The same restriction applies
if similar serialization is done by the custom session state store in
'Custom' mode.]
System.Web.Util.AltSerialization.WriteValueToStream(Object value,
BinaryWriter writer) +1847
System.Web.SessionState.SessionStateItemCollection.WriteValueToStreamWithAssert(Object
value, BinaryWriter writer) +34
System.Web.SessionState.SessionStateItemCollection.Serialize(BinaryWriter
writer) +638
System.Web.SessionState.SessionStateUtility.Serialize(SessionStateStoreData
item, Stream stream) +244
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

Version Information: Microsoft .NET Framework Version:4.0.30319;
ASP.NET Version:4.0.30319.272

Somebody PLEASE tell me I don't need to serialize every object in Nopcommerce to do this!

Best Answer

As the exception says your Type

NopSolutions.NopCommerce.BusinessLogic.Categories.Category

is not serializable. I dont know the implementation of that type but you can try to decorate the type with the [Serializable] attribute.

If you cant do this you can simply write the id of the object to your session.

If you want your session stored in sql server, every object your write into your session needs to be serializable.

More Information

Related Topic