2010-03-16 18 views
9

Me di cuenta hoy de que simplemente he seguido ciegamente este requisito durante años sin preguntar realmente por qué. Hoy, me encontré con una excepción NotSerializableException con un objeto modelo que creé desde cero y me di cuenta de que ya era suficiente.¿Por qué los objetos de transferencia necesitan implementar Serializable?

Me dijeron que esto se debía a la replicación de la sesión entre servidores de carga equilibrada, pero sé que he visto otros objetos en el ámbito de la sesión que no implementan Serializable. ¿Es esta la verdadera razón?

Respuesta

4

Es la verdadera razón. Si de hecho importará en la práctica, depende completamente de si el servidor web o el servidor de aplicaciones de hecho serializarán el objeto (o validarán que es serializable, pero de manera realista la única manera de hacerlo es serializarlo realmente).

La mayoría de los servidores de aplicaciones tienen la opción (al menos) de no ser estrictos al respecto. Si no utiliza servidores con equilibrio de carga que realmente comparten estado, entonces es posible que lo haya visto sin problemas.

+0

Gracias. Tiene sentido. Entonces, ¿algún objeto con ámbito de sesión que no implementó Serializable no mantenía el estado o se ejecutaba en servidores con equilibrio de carga que no compartían el estado? – sma

+0

Un objeto no se serializará independientemente de cualquier estado que mantenga, siempre que no implemente Serializable, por lo que si entiendo su pregunta correctamente, la respuesta es que los objetos puestos en la sesión que no implementaron Serializable estaban en hecho no serializado por el contenedor, por lo que no vio un problema. – Yishai

10

Porque para ser transferidos a través de un cable deben ser serializables a una forma que se pueda poner en el cable.

Como binario o XML, JSON, o simillar

Hay más información aquí ... Should any domain object, not be serializable?

+0

No creo que deba implementar Serializeble para tener XML o JSON marhsalling unmarshalling a través de un cable. Lo necesita para formatos binarios, por ejemplo, en RMI. Pero creo que la razón principal es porque estos DTO son parte de una sesión HTTP y, por lo tanto, TENEMOS que ser serializables de acuerdo con la especificación del servlet. – HDave

1

Creo que el concepto es similar a que se le pregunte, por qué los alimentos sólidos deben masticarse antes de tragarse para la digestión. Pero, por supuesto, la diferencia es que el bien digerido no se puede deserializar de todos modos.

Recuerdo el uso de Sun RPC (hoy en día llamado ONC RPC) que realiza la codificación XDR porque las plataformas/sistemas de computadora representan sus datos en sus respectivos formularios. Por ejemplo, big endian vs endian pequeño.

Pero la JVM, independientemente de la máquina es big-endian, por lo que la permanencia no debería ser una razón.

La estructura de datos en la memoria de la computadora tiene punteros y es posible que todos los elementos de un objeto no se asienten en un bloque de memoria contiguo. Sin embargo, cuando pasa un objeto thro i/o a otro sistema, no puede pasar la distribución de memoria de ese objeto.

Un objeto necesita ser serializado antes de ser almacenado en una base de datos porque usted no quiere y no puede replicar la disposición dinámicamente cambiante de la memoria del sistema.

Nuestra capa de representación de datos en las redes está basada en secuencias de bits. Por lo tanto, cuando desea pasar datos de un sistema a otro, debe convertir los datos dimensionales representados en la memoria a uno que pueda transmitirse a través de las redes byte a byte. En realidad, poco a poco, y que a menudo va a través de encriptación de compresión y seguridad. Las rutinas de compresión y encriptación son oo-structure-blind y se presuponen flujos de bits. Los conmutadores de red son oo-estructural-blind. La transmisión de red ni siquiera ve bits. Los bits están codificados en una señal de transmisión que a menudo es sinusoides analógica y luego modulada. Estos procesos no funcionan en esquemas multidimensionales/jerárquicos de datos oo-estructurados.

Supongo que puede realizar la ofuscación de nivel de objeto y el cifrado, pero aún tiene que permitir que el sistema los convierta en flujos de bits, convirtiéndolos primero en char-streams.

Marshalling es cuando el pastor tiene una manada de ovejas y las dirige a través de un puente de ovejas sobre aguas turbulentas.Por lo tanto, un Marshaller tiene que ordenar nuestros objetos en esquemas seriales con referencias escritas, de modo que cuando la manada de ovejas de información emerja desde el otro extremo del puente, podamos volver a reunirlos en sus esquemas jerárquicos mediante el conjugado-demarshaller . En nuestro caso, nuestra oveja no se encuentra en un puente, sino en bobinados estrechos y precarios y deslizamientos de tierra donde el equipo de transmisión de la red en cada turno almacena una copia de la oveja montada para asegurar que puedan reenviar la copia en caso de que alguna de las las ovejas cayeron en un barranco.

+1

* bueno digerido no se puede deserializar de todos modos * Depende de qué comida era inicialmente. Mi perro puede hacer esto> :) –

+1

Mi perro come comida serializada también. ugghh. Existe una teoría de por qué un perro a veces come comida serializada. El razonamiento es que sus tractos intestinales son cortos, de modo que cuando un perro come su propio alimento serializado, está alargando su tracto digestivo dos veces. Y cuando come alimentos serializados por otro mamífero como un caballo, toma prestado el sistema digestivo del caballo porque no puede procesar la fibra de la hierba con la misma eficacia que un caballo o una vaca. –

Cuestiones relacionadas