Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I find which object in ASP.NET can't be serialized?

I'm getting the following error in my 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.

The stack trace isn't providing any good information on which object is not able to serialize. Is there a good way to find the problem child?

Edit: I've found the issue, I was trying to serialize a Linq statement(not executed). But I'll try an choose an answer that would have best solved this issue.

like image 262
Yuriy Faktorovich Avatar asked Nov 20 '09 19:11

Yuriy Faktorovich


3 Answers

Really, you should mainly be storing your own state data / objects (ideally modelled as DTO classes), in which case the answer is: any you mark as [Serializable] or ISerializable. You shouldn't be adding raw UI controls or other unknown objects to session-state. In particular, for reasons like this, which had a major performance impact on an app the other day.

like image 142
Marc Gravell Avatar answered Sep 20 '22 00:09

Marc Gravell


MbUnit (now Gallio) has an Assert.IsSerializable() test that could come in handy here.

like image 24
Wyatt Barnett Avatar answered Sep 21 '22 00:09

Wyatt Barnett


You can try to serialize the object, and inspect the System.Runtime.Serialization.SerializationException that's thrown when it's not serializable. It should tell you which member or parent of the object can't be serialized.

Example code:

var f = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
f.Serialize(new System.IO.MemoryStream(), yourObject);
like image 23
Protector one Avatar answered Sep 19 '22 00:09

Protector one