¿Cuál es la necesidad de serialización de objetos en Java? [closed]

10 minutos de lectura

Avatar de usuario de JavaUser
Usuario de Java

¿Alguien puede decirme cuál es la necesidad de Serialización de objetos en Java y darme un escenario de ejemplo para explicar la necesidad? (Ya entiendo qué es la serialización, solo quiero entender cuándo la usaría y cómo la usaría).

  • En la serialización, el punto no es convertir un objeto en bits y bytes, los objetos ya SON bits y bytes. La serialización es el proceso de hacer que el “estado” del objeto sea persistente. Lea esto: stackoverflow.com/a/69416269/9868445

    – aderchox

    2 oct 2021 a las 11:02


Avatar de usuario de Amit Kumar Gupta
Amit Kumar Gupta

Breve historia sobre la serialización.

Después de muchos años de arduo trabajo, los científicos de la Tierra desarrollaron un robot que puede ayudarlos en el trabajo diario. Pero este robot tenía menos funciones que los robots desarrollados por los científicos del planeta Marte.

Tras una reunión entre los científicos de ambos planetas, se decide que Marte enviará sus robots a la Tierra. Pero ocurrió un problema. El costo de enviar 100 robots a la Tierra fue de $100 millones. Y toma alrededor de 60 días de viaje.

Finalmente, los científicos de Marte decidieron compartir su secreto con los científicos de la Tierra. Este secreto era sobre la estructura de clase/robot. Los científicos de la Tierra desarrollaron la misma estructura en la Tierra misma. científicos de Marte serializado los datos de cada robot y los enviaba a la tierra. científicos de la tierra deserializado los datos y los introdujo en cada robot en consecuencia.

Este proceso les ahorró tiempo en la comunicación de una gran cantidad de datos.

Algunos de los robots estaban siendo utilizados en algún trabajo defensivo en Marte. Así que sus científicos marcaron algunas propiedades cruciales de esos robots como transitorio antes de enviar sus datos a la Tierra. Tenga en cuenta que la propiedad transitoria se establece en nulo (en caso de referencia) o en el valor predeterminado (en caso de tipo primitivo) cuando el objeto se deserializa.

Un punto más notado por los científicos de la Tierra es que los científicos de Marte les pidieron que crearan algunos variables estáticas para mantener los detalles sobre el medio ambiente. Estos detalles son utilizados por algunos robots. Pero los científicos de Marte no comparten estos detalles. Porque el ambiente de la Tierra era diferente del ambiente de Marte.

A pesar de conocer la estructura de clases de robots y tener datos serializados, los científicos de la Tierra no pudieron deserializar los datos que pueden hacer que los robots funcionen.

Exception in thread "main" java.io.InvalidClassException:
SerializeMe; local class incompatible: stream classdesc
:

Los científicos de Mars estaban esperando el pago completo. Una vez que se realizó el pago, los científicos de Mars compartieron el serialversionUID con los científicos de la Tierra. El científico de la Tierra lo configuró en clase de robot y todo comenzó a funcionar.

Actualizar

Aunque con la ayuda de la serialización, pudieron enviar datos utilizando señales en lugar de una nave espacial real, se dieron cuenta de que enviar un gran conjunto de datos seguía siendo un desafío. La serialización abarataba y agilizaba el proceso, pero seguía siendo lento. Por lo tanto, a los diferentes científicos se les ocurrieron diferentes ideas para reducir el tamaño de los datos. Algunos científicos sugirieron comprimir los datos y otros sugirieron usar un mecanismo diferente para representarlos, de modo que puedan volver a deserializarse. Algunas de las ideas son XML, JSON, paquete de mensajes, निम्न (Nimn)

  • seguí tu historia [here] (stackoverflow.com/questions/447898/what-is-object-serialization/… )

    – sin duda

    18 de junio de 2011 a las 15:51


  • gracias @noquery, me salté parte de la parte relacionada con la serialización. Intentaré cubrir la parte restante también.

    – Amit Kumar Gupta

    18 de junio de 2011 a las 16:40

  • Me encantó la historia. Espero que todos puedan explicar con historias como esta. ¿Cómo puedo votar varias veces?

    – Khatri

    01/08/2016 a las 16:40

  • Gracias. Me encanta la forma natural de explicar las cosas siempre que puedo.

    – Amit Kumar Gupta

    01/08/2016 a las 19:02

  • Una manera bastante interesante de explicar. Esta historia me recuerda a la serie de televisión “The Expanse”.

    – mss

    21 de febrero de 2020 a las 6:03


Avatar de usuario de Vaishak Suresh
Vaishak Suresh

La serialización generalmente se usa cuando surge la necesidad de enviar sus datos a través de la red o almacenarlos en archivos. Por datos me refiero a objetos y no a texto.

Ahora el problema es que su infraestructura de red y su disco duro son componentes de hardware que entienden bits y bytes pero no objetos JAVA.

La serialización es la traducción de los valores/estados de su objeto Java a bytes para enviarlo a través de la red o guardarlo.

Esto es análogo a cómo se transmite su voz a través de líneas telefónicas PSTN.

  • el análogo de hacer una llamada telefónica para transmitir voz por cable si es realmente bueno. Gracias

    – fuyi

    18 de junio de 2022 a las 12:25

Avatar de usuario de Michael Aaron Safyan
Michael Aarón Safian

Serialización de Java (y, específicamente, la Serializable y Exernalizable interfaces) le permite leer/escribir objetos Java arbitrariamente complicados, automática o manualmente desde/hacia el disco o desde/hacia la red. Mientras que XML y JSON son formatos de texto, la serialización de Java es un formato binario. (La serialización también es un concepto general de simplemente leer/escribir datos, pero dado que la pregunta es sobre Java, supongo que se refiere al sistema de serialización incorporado, es decir, Serializable/Exernalizable)

Ventajas de los “implementos Serializables” sobre XML/JSON

Al principio, obtienes la serialización prácticamente gratis. No necesita realizar muchos cambios en sus objetos para permitir que el mecanismo de serialización funcione con ellos. Otra ventaja es que, debido a que es un formato binario, es mucho más compacto que el formato textual, por lo que probablemente utilizará menos espacio (lo cual es bueno para conservar el ancho de banda de la red o para conservar el espacio de almacenamiento en el disco).

Desventajas “implementa Serializable” sobre XML/JSON

La desventaja de la serialización de Java incorporada es que, si realiza cambios en su objeto, hacer que los diferentes formatos de serialización sean compatibles puede ser realmente una gran pesadilla. Además, mientras que puede editar XML y JSON manualmente, no puede editar un objeto Java serializado (sin leerlo en Java). Por las mismas razones, a menudo es más fácil depurar XML y JSON que los formatos binarios, porque XML y JSON son legibles por humanos. Otra desventaja con el mecanismo de serialización incorporado de Java es que no puede (fácilmente) serializar/deserializar los datos de otro lenguaje de programación.

Técnicas alternativas para leer/escribir datos

Existen técnicas de serialización alternativas además de la serialización integrada de Java que le brindan lo mejor de ambos mundos: formatos binarios compactos, interoperabilidad de lenguajes, facilidad de compatibilidad de versiones y, a menudo, herramientas de depuración que facilitan el volcado de datos binarios en un formato legible. Por ejemplo, el código abierto de Google búferes de protocolo y paquete de mensajes son ejemplos de bibliotecas/formatos de serialización que le permiten leer/escribir datos binarios compactos y mantener fácilmente la compatibilidad de versiones. La mayor desventaja de estas bibliotecas sobre la serialización de Java incorporada es que involucran objetos de datos antiguos simples para la serialización (a diferencia de los objetos de Java más completos que también tienen un comportamiento asociado con ellos); sin embargo, esta desventaja es, de hecho, una ventaja, ya que separar el modelo de datos en el cual/desde el cual se almacena la información de los objetos que los envuelven o se derivan de ellos es en realidad una buena práctica de programación y facilita la compatibilidad con múltiples formatos.

Uso

Dado que solicitó la necesidad, no solo la definición, hay una serie de casos de uso:

  1. Simplemente guarde sus datos para usarlos más tarde. Por ejemplo, supongamos que está escribiendo un videojuego. Su programa no se ejecutará para siempre; incluso si nunca falla (que es de esperar que sea el caso), es probable que el usuario salga del programa en algún momento o que el sistema operativo elimine el programa para ahorrar recursos (por ejemplo, en Android, los procesos en segundo plano con los que el usuario no interactúa son frecuentes). y eliminado intencionalmente por el sistema operativo para recuperar recursos del sistema como RAM). Para asegurarse de que el usuario no comience desde el principio y pueda continuar desde donde estaba o desde el punto de guardado más reciente, deberá escribir el estado del juego en el almacenamiento persistente (es decir, el disco duro, la cuenta de Google Drive del usuario, etc.). Para hacer esto, necesitas traducir las estructuras de datos en la memoria que representan el estado del juego a bytes sin procesar que puedes escribir en el disco (o en cualquier sistema en el que estés guardando los datos).

  2. Recuperación de información de un servidor remoto. Sigamos con el ejemplo del juego… supongamos que está creando un juego multijugador en línea o que desea que sea posible proporcionar nuevos niveles o elementos en el juego sin que el usuario actualice su aplicación. Para hacer esto, querrá que la información sobre el jugador en línea o la información sobre los nuevos niveles/elementos se comunique desde una computadora servidor (que usa como punto de contacto para todas las copias de la aplicación instalada en varios dispositivos) a las copias individuales de la aplicación. Tanto el servidor como la aplicación necesitan algún tipo de representación en memoria de estas estructuras de datos (por ejemplo, la ubicación de otros jugadores, la estructura de un nuevo nivel, la descripción/imagen de un nuevo elemento, etc.), pero para transferir la información desde el servidor hasta la aplicación en el dispositivo, el sistema de comunicación consta de bytes sin procesar, por lo que es necesario tener una forma de convertir los datos en bytes sin procesar y de bytes sin procesar a una estructura de datos significativa en la memoria.

Prácticamente cualquier comunicación entre dos procesos/aplicaciones diferentes o entre una aplicación y algún sistema de almacenamiento es un caso en el que se requiere algún tipo de mecanismo de serialización.

Avatar de usuario de Thilo
tilo

Cuando desee guardar el estado de un objeto en un archivo o enviarlo a través de la red, debe transformarlo en una serie de bytes. Esto se llama serialización.

Java tiene un mecanismo incorporado para eso, otras opciones incluyen XML o JSON.

Ejemplos cuando necesita esto: almacenamiento en caché de objetos, hacer llamadas a métodos remotos, guardar un gráfico de objetos en el disco.

  • Si desea almacenar un objeto (-estructura) en el disco, necesitará la serialización.
  • Un servicio web requiere la serialización de objetos a xml antes de que puedan transmitirse.

Avatar de usuario de Gagandeep Singh
Gagandeep Singh

Y también puede implementar la clonación de objetos mediante la serialización.

avatar de usuario de user095736
usuario095736

La serialización generalmente se refiere a la conversión de un objeto en una serie de bits. es esencial en Java, ya que Java está destinado principalmente a aplicaciones basadas en la web. Me refiero a que los datos estén disponibles en toda la red.

¿Ha sido útil esta solución?