¿Cuál es el propósito de la serialización en Java?

105

He leído bastantes artículos sobre serialización y cómo es tan agradable 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.

m_a_khan
fuente
10
¿Qué "no fue convincente" sobre sus argumentos? ¿Y por qué no ha aceptado ninguna respuesta a sus preguntas?
Anon.
8
Él "no estaba convencido" de que respondieran a sus preguntas.
Anthony Forloney
5
Las respuestas proporcionadas fueron, de hecho, correctas. Si no funcionan para usted, responda a ellos como comentarios e intente resolverlo en lugar de simplemente ignorarlos y luego comenzar a llamar a los demás cuando señalen que no está usando SO correctamente.
Anon.
4
Anon contribuye a la calidad del sitio al desalentar las preguntas duplicadas. Es una tontería ver cinco preguntas separadas que hacen lo mismo. Si no puede obtener una respuesta, bueno, a veces es así. Si obtiene una respuesta, pero no parece funcionar, continúe la discusión en los comentarios. SO no es una caja mágica que mágicamente le dará una respuesta si solo hace la pregunta correcta, o pregunta suficientes veces, o llama la atención del experto correcto.
Chris
1
O bien: (Acepte la respuesta) o (Publique un comentario y / o modifique la pregunta explicando por qué no es lo que necesita).
Anon.

Respuestas:

182

Primero definamos la serialización, luego podemos hablar sobre por qué es tan útil.

La 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 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 necesitan comunicarse, una forma fácil es que una máquina cree un objeto con información que le gustaría transmitir y luego serialice ese objeto a la otra máquina. No es el mejor método de comunicación, pero hace el trabajo.

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

  • Copia profunda: si necesita una réplica exacta de un objeto y no quiere tomarse la molestia de escribir su propia clase clone () especializada, simplemente serialice el objeto en una matriz de bytes y luego deserialice a otra objeto logra este objetivo.

  • Almacenamiento en caché: en realidad, solo una aplicación de lo anterior, pero a veces un objeto tarda 10 minutos en compilarse, pero solo 10 segundos en deserializar. Entonces, en lugar de retener el objeto gigante en la memoria, simplemente almacénelo en un archivo mediante serialización y léalo más tarde cuando sea necesario.

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

Schmelter
fuente
62
¿Qué diablos toma 10 minutos para construir?
oxbow_lakes
2
Mi punto es (por supuesto) que la E / S de archivo involucrada en la serialización probablemente empequeñecerá cualquier sobrecarga pura de creación de objetos. 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
oxbow_lakes
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 ese puede tardar mucho en compilarse, pero una vez que lo haya creado, se puede serializar / deserializar con relativa rapidez.
David
Si la solicitud de la aplicación web tiene que pasar por todos y cada uno de los enrutadores del mundo antes de llegar al destino, construir el objeto, regresar con el objeto usando la ruta más larga posible, sí, puede tomar 10 minutos.
Vaibs
@Schmelter, ya que mencionas que la serialización no es el mejor método de comunicación, ¿cuál es el mejor método para implementar?
Ashfaque Rifaye
58

Mientras ejecuta su aplicación, todos sus objetos se almacenan en la memoria (RAM). Cuando sale, esa memoria es reclamada por el sistema operativo y su programa esencialmente 'olvida' todo lo que sucedió mientras se estaba ejecutando. La serialización soluciona esto permitiendo 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á alguna forma de serialización.

Gordon Gustafson
fuente
2
Entonces, ¿parece que es una forma mejor y más eficiente de escribir datos en un archivo y volver a leerlos cuando sea necesario?
m_a_khan
1
Esta es la única explicación REAL. No puedo pensar en ninguna otra aplicación de serialización +1 en el mundo real
Emily
Corto y dulce. Explicación perfecta.
Yakhoob
21

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

Tenía varios proyectos que necesitaban cargar y leer un montón de archivos de texto. Los archivos contenían palabras vacías, 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 ponerlas 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 que creé un objeto para leer cada uno de estos archivos y para poblar matrices 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.

Rushdi Shams
fuente
1
En tal caso, ¿por qué necesita almacenarlos en un flujo de matriz de bytes (usando serializar), podría ser más simple que simplemente usar un campo temporal?
kidnan1991
3

En esencia :

La serialización es el proceso de convertir un conjunto de instancias de objetos que contienen referencias entre sí en un flujo lineal de bytes, que luego pueden enviarse a través de un socket, almacenarse en un archivo o simplemente manipularse como un flujo de datos.

Ver usos de Wiki :

La serialización tiene varias ventajas. Proporciona:

  1. un método de persistencia de objetos que es más conveniente que escribir sus propiedades en un archivo de texto en el disco y volver a ensamblarlos leyendo esto nuevamente en.
  2. un método para emitir llamadas a procedimientos remotos, por ejemplo, como en SOAP
  3. un método para distribuir objetos, especialmente en componentes de software como COM, CORBA, etc.
  4. un método para detectar cambios en datos variables en el tiempo.
Piscina
fuente
1

La más obvia es que puede transmitir la clase serializada a través de una red y el receptor puede construir un duplicado de la instancia original. Asimismo, 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 heterogénea completa de una sola vez, si lo desea.

ddyer
fuente
0

Los objetos serializados mantienen el estado en el espacio, se pueden transferir a través de la red, sistema de archivos, etc ... y en el tiempo, pueden sobrevivir a la JVM que los creó.

A veces esto es útil.

David Soroko
fuente
Esto se puede lograr con un archivo simple que también contenga 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?
m_a_khan
@m_a_khan: Vaya. Sí, se puede hacer con un simple texto. Pero tan pronto como los Objetos se vuelven más complejos, o mejor, sus estructuras (composición, herencia) se vuelven más complejas, se convertirá en una molestia para (des) ordenarlos manualmente. Imagínese tener listas, conjuntos y mapas como miembros de objetos.
Dirk Schumacher
Es fácil crear 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"
David Soroko
0

Utilizo 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.

Ron Norman
fuente
1
En mi opinión, la búsqueda y el uso de un único objeto de configuración como parámetro son bastante ortogonales. Probablemente este no sea un caso de uso típico.
Gábor Bakos
0

Con el simple propósito de aprender (fíjense, dije aprender, no dije lo mejor, ni siquiera bueno, pero solo para entender las cosas), puede guardar sus datos en un archivo de texto en la computadora, luego tener un programa que lee esa información, y según el archivo, puede hacer que su programa responda de manera diferente. Si fuera más avanzado, no necesariamente tendría que ser un archivo txt, sino algo más.

Serializar, por otro lado, pone las cosas directamente en lenguaje informático. Es como si le estuvieras contando a una computadora en español algo en español, en lugar de decirle algo en francés, obligándolo a aprender francés y luego guardar las cosas en su español nativo traduciéndolo todo. No es la respuesta más intensiva en tecnología, solo estoy tratando de 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 estuvieran representados como primitivos en la pila. Velocidad, velocidad, velocidad. Y menos procesamiento de archivos desde el punto de vista del programador.

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