Varias respuestas han cubierto las razones de por qué es posible que desee utilizar la serialización en general. Parece que también quiere saber por qué una clase específica tiene el atributo [Serializable]
y se pregunta por qué se pudo haber hecho.
Con ASP.NET, el almacenamiento de estado de sesión predeterminado es InProc
, que le permite almacenar cualquier objeto como referencia y dejarlo en el montón. Esta es la mejor forma de almacenar el estado de la sesión, sin embargo, solo funciona si está utilizando un solo hilo de trabajo o si todo el estado de la sesión podría reconstruirse automáticamente si el hilo del trabajador fuera a cambiar (poco probable). Para los demás modos de almacenamiento de estado (StateServer
y SQL Server
), todos los objetos de estado de la sesión deben ser serializables, ya que el motor ASP.NET serializará estos objetos primero mediante serialización binaria antes de enviarlos al medio de almacenamiento.
En su caso, puede estar utilizando InProc
. Sin embargo, una razón para marcar todas las clases que se usan en el estado de sesión como Serializable
y probarlas de esa manera es que puede ser necesario cambiar esto en el futuro (por ejemplo, para usar un Web Farm). Si no diseña sus clases de estado de sesión con esto en mente, será bastante difícil hacer la migración en el futuro.
Además, solo porque puede eliminar el atributo Serializable
y el programa "funciona" en un entorno no significa que funcione en otro entorno. Por ejemplo, puede funcionar bien en el servidor web de prueba de Visual Studio (que siempre usa el modo de estado de sesión InProc
) e incluso en una instancia de desarrollo de IIS, pero luego, quizás una instancia de producción de IIS se configure para usar un modo de almacenamiento diferente.
Estas diferencias ambientales/de configuración no están necesariamente limitadas a las aplicaciones ASP.NET. Hay otros motores de aplicaciones que pueden hacer esto o incluso aplicaciones independientes que lo hacen (no es difícil crear este tipo de entorno configurable).
Finalmente, puede estar trabajando con una biblioteca que puede ser consumida por diferentes aplicaciones. Algunos pueden necesitar almacenar el estado de una manera serializable y otros pueden no.
Debido a estos factores, a menudo es una muy buena idea, al menos cuando se construye una biblioteca, considerar marcar clases de valor simples o clases de administración de estado con [Serializable]
. Tenga en cuenta que esto aumenta el trabajo para probar estas clases y hay límites para lo que se puede serializar (es decir, una clase que contiene una referencia de socket o de archivo abierto puede no ser un buen candidato para la serialización ya que los recursos externos abiertos no se pueden serializar) así que no abuses de esto.
Ha preguntado si usar [Serializable]
será más lento. No, no lo será Este atributo no tiene un efecto directo en el rendimiento. Sin embargo, si el entorno de la aplicación se cambia para serializar el objeto, entonces sí, el rendimiento se verá afectado. Es el acto de serializar y deserializar que es más lento que solo almacenar el objeto en el montón. [Tenga en cuenta que algunas rutinas podrían escribirse para buscar el atributo Serializable
y luego elegir serializar, pero esto es raro; generalmente es como ASP.NET y deja a un administrador o usuario decidir si quiere cambiar el medio de la tienda.]
¿Es posible que se esté almacenando en SessionState cuando se usa Out-of-Proc/SQL? Esos modos de sesión requieren serialización. – vcsjones
No estoy seguro de estar siguiendo su pregunta. ¿Estás realmente preguntando "¿por qué querría serializar un objeto?" –
@Kirk Woll, eso es correcto – user194076