2010-02-09 12 views
80

He leído un buen número de artículos sobre Serialización y cómo es tan bueno y genial, pero ninguno de los argumentos fue lo suficientemente convincente. Me pregunto si alguien realmente puede decirme qué es lo que realmente podemos lograr al serializar una clase.¿Cuál es el propósito de la serialización en Java?

+0

¿Quiere decir serializar clases u objetos? – Yoni

+10

¿Qué "no fue convincente" sobre sus argumentos? ¿Y por qué no has aceptado ninguna respuesta a tus preguntas? –

+7

Él "no estaba convencido" de que respondieran sus preguntas. –

Respuesta

151

Primero vamos a definir la serialización, luego podemos hablar de por qué es tan útil.

Serialización es simplemente convertir un objeto existente en una matriz de bytes.Esta matriz de bytes representa la clase del objeto, la versión del objeto y el estado interno del objeto. Esta matriz de bytes se puede usar entre las JVM que ejecutan el mismo código para transmitir/leer el objeto.

¿Por qué querríamos hacer esto?

Hay varias razones:

  • Comunicación: Si tiene dos máquinas que ejecutan el mismo código, y que necesita para comunicarse, una forma fácil es para una máquina para construir un objeto con información que le gustaría transmitir, y luego serializar ese objeto a la otra máquina. No es el mejor método para la comunicación, pero hace el trabajo bien.

  • Persistencia: si desea almacenar el estado de una operación en particular en una base de datos, puede serializarla fácilmente en una matriz de bytes y almacenarla en la base de datos para su posterior recuperación.

  • copia profunda: Si necesita un exacta réplica de un objeto, y no quiere tomarse la molestia de escribir su propia clase especializada clon(), sólo tiene que serializar el objeto a una matriz de bytes, y luego, deserializarlo en otro objeto logra este objetivo.

  • Almacenamiento en memoria caché: Realmente solo una aplicación de las anteriores, pero a veces un objeto tarda 10 minutos en construirse, pero solo demoraría 10 segundos en deserializarse. Por lo tanto, en lugar de mantener el objeto gigante en la memoria, simplemente almacénelo en un archivo mediante serialización y léelo más tarde cuando sea necesario.

  • Sincronización de JVM cruzada: la serialización funciona en diferentes JVM que pueden estar ejecutándose en diferentes arquitecturas.

+46

¿Qué demonios lleva 10 minutos construir? –

+2

Mi punto es (por supuesto) que el archivo de E/S involucrado en la serialización probablemente empequeñecerá cualquier sobrecarga de creación de objetos puros. Supongo que podría estar hablando de algo computacionalmente muy costoso como el modelado científico, pero la serialización es un mecanismo muy pobre para la persistencia debido a que es difícil manejar los cambios de esquema. –

+11

@oxbow_lakes Un ejemplo podría ser si mantiene un índice de un conjunto particular de datos para una búsqueda rápida. Un índice como este puede llevar mucho tiempo construirlo, pero una vez que lo haya construido, puede ser serializado/deserializado relativamente rápido. – David

1

El más obvio es que puede transmitir la clase serializada a través de una red, y el destinatario puede construir un duplicado de la instancia original. Del mismo modo, puede guardar una estructura serializada en un sistema de archivos.

Además, tenga en cuenta que la serialización es recursiva, por lo que puede serializar una estructura de datos completamente heterogénea en un solo swop, si lo desea.

3

In essense:

serialización es el proceso de la conversión de un conjunto de instancias de objeto que contienen referencias a uno al otro en un flujo lineal de bytes, que entonces se pueden enviar a través de un socket, almacenan en un archivo, o simplemente manipulado como un flujo de datos

Ver utiliza desde Wiki:

La serialización tiene una serie de ventajas. Se ofrece:.

  1. un método de objetos persistentes, que es más conveniente que escribir sus propiedades a un archivo de texto en disco y volver a ensamblarlas por leer esta de vuelta en
  2. una método de la emisión de llamadas a procedimiento remoto, por ejemplo, como en SOAP de
  3. un método para distribución de objetos, especialmente en conjunto de componentes de software tales como COM, CORBA, etc.
  4. un método para detectar cambios en los datos variables en el tiempo.
0

objetos serializados mantienen el estado en el espacio, que puede ser transferido por la red, sistema de archivos, etc ... y el tiempo, pueden sobrevivir a la JVM que los creó.

A veces esto es útil.

+0

Esto se puede lograr con un archivo simple que también contiene texto. Es un poco más fácil leer un objeto serializado que leer el estado del objeto escrito en un archivo de texto, ¿correcto? –

+0

@m_a_khan: Wow. Sí, se puede hacer con un texto simple. Pero tan pronto como los Objetos se vuelvan más complejos, o mejor, sus estructuras (composaciones, herencia) se vuelvan más complejas, se volverá una molestia ordenarlas (des) manualmente. Imagine tener listas, conjuntos y mapas como miembros del objeto. –

+0

Es fácil encontrar diferentes esquemas de serialización y, de hecho, existen muchos. Por muy buenas razones, ninguno de ellos resulta en el caso general, en un "texto simple" –

42

Mientras ejecuta su aplicación, todos sus objetos se almacenan en la memoria (RAM). Cuando sale, el sistema operativo recupera esa memoria y su programa esencialmente 'olvida' todo lo que sucedió mientras se estaba ejecutando. La serialización soluciona esto al permitir que su aplicación guarde objetos en el disco para que pueda leerlos la próxima vez que se inicie. Si su aplicación va a proporcionar alguna forma de guardar/compartir un estado anterior, necesitará algún tipo de serialización.

+1

Entonces, parece que es solo una forma mejor y más eficiente de escribir datos en un archivo y leerlos cuando sea necesario. –

+1

¡Buena explicación, gracias! –

+1

Esta es la única explicación REAL. No puedo pensar en ninguna otra aplicación de serialización en el mundo real +1 – Emily

16

Puedo compartir mi historia y espero que nos dé algunas ideas sobre por qué es necesaria la serialización. Sin embargo, las respuestas a su pregunta ya son notablemente detalladas.

Tuve varios proyectos que necesitan cargar y leer un montón de archivos de texto. Los archivos contenían palabras de finalización, verbos biomédicos, abreviaturas biomédicas, palabras conectadas semánticamente entre sí, etc. El contenido de estos archivos es simple: palabras!

Ahora para cada proyecto, necesitaba leer las palabras de cada uno de estos archivos y ponerlos en diferentes matrices; como el contenido del archivo nunca cambió, se convirtió en una tarea común, aunque redundante, después del primer proyecto.

Entonces, lo que hice fue crear un objeto para leer cada uno de estos archivos y llenar arreglos individuales (variables de instancia de los objetos). Luego serialicé los objetos y luego para los proyectos posteriores, simplemente los deserialicé. No tuve que leer los archivos y llenar las matrices una y otra vez.

1

Uso objetos serializados para estandarizar los argumentos que paso a funciones o constructores de clases. Pasar un bean serializado es mucho más limpio que una larga lista de argumentos. El resultado es un código que es más fácil de leer y depurar.

+0

En mi opinión, la búsqueda de información y el uso de un solo objeto de configuración como parámetro son bastante ortogonales. Probablemente este no es un caso de uso típico. –

0

Para el simple propósito de aprender (aviso, dije aprender, no dije mejor, o incluso bueno, pero solo por el bien de entender cosas), podría guardar sus datos en un archivo de texto en la computadora, luego, tenga un programa que lea esa información, y basado en el archivo, podría hacer que su programa responda de manera diferente. Si fueras más avanzado, no necesariamente tendría que ser un archivo de texto, sino algo más.

Serializar por otro lado, pone cosas directamente en el lenguaje de la computadora. Es como si estuvieras diciéndole a una computadora en español algo en español, en lugar de contarle algo en francés, forzándolo a aprender francés, y luego guardar cosas en su español nativo traduciendo todo. No es la respuesta más tecnológica, solo intento crear un ejemplo comprensible en un formato de lenguaje común.

La serialización también es más rápida, porque en Java, los objetos se manejan en el montón, y toman mucho más tiempo que si se representaran como primitivos en la pila. Velocidad, velocidad, velocidad Y menos procesamiento de archivos desde el punto de vista de un programador.

+0

Al intentar poner las cosas en un lenguaje sencillo, realmente no has explicado la serialización de ninguna manera útil. – user3516726

1

La serialización se utiliza en los casos en los que desea guardar un estado de objeto y convertir ese objeto en una secuencia de bytes, los objetos deben ser corregidos. Mientras ejecuta su aplicación, todos sus objetos se almacenan en la memoria (memoria de montón). Cuando sale, el sistema operativo recupera esa memoria y su programa esencialmente 'olvida' todo lo que sucedió mientras se estaba ejecutando. En este tipo de situaciones, puede usar la serialización al permitir que su aplicación guarde objetos en el disco para que pueda leerlos nuevamente la próxima vez que se inicie. Si su aplicación va a proporcionar alguna forma de guardar/compartir un estado anterior, necesitará algún tipo de serialización.

Cada vez que un objeto tiene que enviarse a través de la red, esos objetos se deben serializar. Por ejemplo, si tiene dos máquinas que ejecutan el mismo código y necesitan comunicarse, una forma fácil es que una máquina construya un objeto con información que le gustaría transmitir y luego serializar ese objeto a la otra máquina. . No es el mejor método para la comunicación, pero hace el trabajo con la serialización.

Sincronización cruzada de JVM: la serialización funciona en diferentes máquinas virtuales Java de JVM que pueden estar ejecutándose en diferentes arquitecturas.

Cuestiones relacionadas