2009-11-20 4 views
6

Estoy recibiendo el siguiente error en mi solicitud:¿Cómo puedo encontrar qué objeto en ASP.NET no se puede serializar?

No puede serializar el estado de la sesión. En el modo 'SQLServer' 'StateServer' y, ASP.NET serializará los objetos de estado de sesión , y como resultado objetos no serializables o objetos MarshalByRef no son permitido. Se aplica la misma restricción si la serialización similar es realizada por el almacén de estado de sesión personalizado en el modo 'Personalizado'.

El seguimiento de la pila no proporciona ninguna buena información sobre qué objeto no se puede serializar. ¿Hay una buena manera de encontrar al niño problemático?

Editar: He encontrado el problema, estaba tratando de serializar una instrucción Linq (no se ejecuta). Pero intentaré elegir la respuesta que mejor haya resuelto este problema.

+0

En realidad no debería ser tan difícil para llegar a una función recursiva que encuentra todas las referencias de un objeto y determinar si la cosa no está marcado como [Serializable]. –

+0

¿Cómo sabría cuáles serían serializados y agregados a la sesión? –

Respuesta

5

Realmente, principalmente debe a almacenar sus propios datos estatales/objetos (idealmente modelados como clases DTO), en cuyo caso la respuesta es: ninguna se marca como [Serializable] o ISerializable. No debe agregar controles de interfaz de usuario crudos u otros objetos desconocidos al estado de la sesión. En particular, por razones like this, que tuvo un gran impacto en el rendimiento en una aplicación el otro día.

+0

+1 Buen punto y enlace informativo. – IrishChieftain

+0

@Marc Gravell: pensé que estaba almacenando un IEnumerable >, el problema era que solo almacenaba la cláusula Linq, pero en otros lugares estaba usando la extensión ToList() para enumerar. –

0

Lo mejor que podría hacer en una situación similar es mirar cada objeto a los que hace referencia la sesión y comprobar si existe el atributo serializable (o que el objeto implementa la interfaz ISerialzable).

2

MbUnit (ahora Gallio) tiene una prueba Assert.IsSerializable() que podría ser útil aquí.

+0

Creé una prueba de unidad que hizo una serialización binaria en la clase que yo pensaba que era la culpable. –

0

Puede encontrar los tipos culpables que desencadenan la excepción de serialización a través de la depuración del código de .NET Framework. Al menos eso es lo que hice.

1

Puede intentar serializar el objeto e inspeccionar el System.Runtime.Serialization.SerializationException que se lanza cuando no se puede serializar. Debería decirle qué miembro o padre del objeto no se puede serializar.

código Ejemplo:

var f = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); 
f.Serialize(new System.IO.MemoryStream(), yourObject); 
+1

Explosión del pasado aquí. Pero sí, siento que he visto más detalles en esa excepción que cuando publiqué la pregunta. –

Cuestiones relacionadas