c# - serializacion - error al reflejar el tipo vb net
No se puede serializar el estado de la sesiĆ³n (8)
Al poner mi aplicación en línea e intentar iniciar sesión recibí este 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 ''Gebruiker'' in Assembly ''App_Code.qzuhycmn, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'' is not marked as serializable.]
System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType type) +9452985
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(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter, SerializationBinder binder) +218
System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.Serialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter, SerializationBinder binder) +54
System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck) +542
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) +1708
[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) +1793
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.OutOfProcSessionStateStore.SetAndReleaseItemExclusive(HttpContext context, String id, SessionStateStoreData item, Object lockId, Boolean newItem) +114
System.Web.SessionState.SessionStateModule.OnReleaseState(Object source, EventArgs eventArgs) +807
System.Web.SessionState.SessionStateModule.OnEndRequest(Object source, EventArgs eventArgs) +184
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.1
Lo único que hago allí con Sessions es esto:
- Session ["Rechten"] = "GlobaalAdmin"; (ejemplo)
- Session ["gebruikerid"] = txtID.Text; (la ID con la que inician sesión)
- Y redirigirlos a otra página: Response.Redirect ("LoggedIn.aspx", true);
- http://pastebin.com/jZprwA8m (Poner el gebruiker en una sesión)
Ha habido múltiples temas sobre este problema, pero ninguno de ellos parece haberme ayudado. Todo funciona localmente, pero en línea no funciona.
¿Podemos ver la clase "Gebruiker"? El error parece bastante sencillo. Gebruiker no se atribuye como Serializable, por lo tanto, no se puede colocar en Session para los modos StateServer y SQLServer.
EDITAR:
Después de mirar el código que ha vinculado, sí, probablemente sea porque la clase no es serializable. La clase generada por LINQ debe ser una clase parcial para que pueda implementar su propia clase parcial que la marque como Serializable y que los requisitos del estado de la sesión se cumplan.
[Serializable()]
public partial class Gebruiker { //Lots of stuff }
EDICION 2:
Thomas, tu clase Gebruiker probablemente tiene una definición que se parece a esto ahora (o algo similar)
namespace XYZ
{
public partial class Gebruiker
}
Simplemente cree otro archivo de clase que tenga el mismo espacio de nombres y defina la clase con el atributo Serializable.
namespace XYZ
{
[Serializable()]
public partial class Gebruiker{}
}
Eso es todo lo que necesitas en este archivo. De esta forma, el atributo serializable no se sobrescribirá cuando se genere la clase Gebruiker generada por LINQ.
Algunas veces debe verificar la propiedad debajo de su web.config
<sessionState mode="InProc" ........../>
En mi caso, estaba intentando serializar el objeto no serializado que es HttpResponse
. Entonces, si las soluciones proporcionadas no funcionan, puede ir a través de la solución de no poder serializar el artículo del estado de la sesión .
Espero que ayude a los demás!
Hay otra solución, Al heredar una clase no serializable, también se implementa el método GetObjectData de la interfaz ISerlializable. La clase heredada también debe marcarse como [Serializable].
La sesión normal simplemente se almacena en la memoria, pero cuando trabajas en un entorno con equilibrio de carga no puedes confiar en el mismo servidor que maneja las devoluciones, por qué la sesión debe almacenarse en un mecanismo de sesión compartida principalmente SQL Server y StateServer.
Esto se puede configurar en machine.config o en algún lugar más profundo que la aplicación web.config por qué podría no ser consciente de dicho cambio, pero podría explicar su repentina excepción cuando se implementa en Internet.
Como se menciona en otra respuesta y en los comentarios, el problema surgiría cuando el objeto de sesión no fuera [Serializable]; mientras trabajas en sesión regular, el objeto no se serializa, sino que simplemente se almacena en la memoria del servidor, pero al conectarse a Internet, se introducen diferentes mecanismos de sesión y la necesidad de que los objetos sean serializables.
Según el código que publicaste: esa clase se genera como partial
, por lo que todo lo que tienes que hacer es agregar otra definición parcial como esta (en el mismo espacio de nombres que la clase parcial generada, por supuesto):
[Serializable]
public partial class Gebruiker {}
Si el modo SessionState = "SQLServer", entonces tiene que usar [Serializable ()] clase parcial pública Gebruiker.
de lo contrario, debe cambiar su modo SessionState a "Inproc" Ejemplo:
Si encuentra este mensaje de error en SharePoint 2013, no olvide ejecutar el siguiente cmdlet de PowerShell:
Enable-SPSessionStateService -DefaultProvision
Este mensaje de error es nuevo en SP2013; vea esta pregunta para SP2010: el estado de la sesión solo se puede usar cuando enableSessionState se configura como verdadero en una configuración