¿Qué es la serialización de objetos?

Resuelto Warrior asked hace 15 años • 15 respuestas

¿Qué se entiende por "serialización de objetos"? ¿Puedes explicarlo con algunos ejemplos?

Warrior avatar Jan 16 '09 01:01 Warrior
Aceptado

La serialización es la conversión de un objeto en una serie de bytes, de modo que el objeto pueda guardarse fácilmente en un almacenamiento persistente o transmitirse a través de un enlace de comunicación. Luego, el flujo de bytes se puede deserializar y convertir en una réplica del objeto original.

TarkaDaal avatar Jan 15 '2009 18:01 TarkaDaal

Puede pensar en la serialización como el proceso de convertir una instancia de objeto en una secuencia de bytes (que puede ser binaria o no según la implementación).

Es muy útil cuando desea transmitir datos de un objeto a través de la red, por ejemplo de una JVM a otra.

En Java, el mecanismo de serialización está integrado en la plataforma, pero es necesario implementar la interfaz Serializable para que un objeto sea serializable.

También puede evitar que algunos datos de su objeto se serialicen marcando el atributo como transitorio .

Finalmente puedes anular el mecanismo predeterminado y proporcionar el tuyo propio; esto puede ser adecuado en algunos casos especiales. Para hacer esto, utiliza una de las funciones ocultas en Java .

Es importante notar que lo que se serializa es el "valor" del objeto, o el contenido, y no la definición de clase. Por tanto, los métodos no están serializados.

A continuación se muestra un ejemplo muy básico con comentarios para facilitar su lectura:

import java.io.*;
import java.util.*;

// This class implements "Serializable" to let the system know
// it's ok to do it. You as programmer are aware of that.
public class SerializationSample implements Serializable {

    // These attributes conform the "value" of the object.

    // These two will be serialized;
    private String aString = "The value of that string";
    private int    someInteger = 0;

    // But this won't since it is marked as transient.
    private transient List<File> unInterestingLongLongList;

    // Main method to test.
    public static void main( String [] args ) throws IOException  { 

        // Create a sample object, that contains the default values.
        SerializationSample instance = new SerializationSample();

        // The "ObjectOutputStream" class has the default 
        // definition to serialize an object.
        ObjectOutputStream oos = new ObjectOutputStream( 
                               // By using "FileOutputStream" we will 
                               // Write it to a File in the file system
                               // It could have been a Socket to another 
                               // machine, a database, an in memory array, etc.
                               new FileOutputStream(new File("o.ser")));

        // do the magic  
        oos.writeObject( instance );
        // close the writing.
        oos.close();
    }
}

Cuando ejecutamos este programa se crea el archivo "o.ser" y podemos ver lo que pasó detrás.

Si cambiamos el valor de: someInteger a, por ejemplo , Integer.MAX_VALUE , podemos comparar la salida para ver cuál es la diferencia.

Aquí hay una captura de pantalla que muestra precisamente esa diferencia:

texto alternativo

¿Puedes ver las diferencias? ;)

Hay un campo adicional relevante en la serialización de Java: el serialversionUID , pero supongo que ya es demasiado largo para cubrirlo.

OscarRyz avatar Jan 15 '2009 19:01 OscarRyz

Atrévete a responder la pregunta de hace 6 años, agregando solo un conocimiento de muy alto nivel para las personas nuevas en Java.

¿Qué es la serialización?

Convertir un objeto a bytes

¿Qué es la deserialización?

Convertir bytes nuevamente a un objeto (deserialización).

¿Cuándo se utiliza la serialización?

Cuando queremos persistir el objeto. Cuando queremos que el objeto exista más allá de la vida útil de la JVM.

Ejemplo del mundo real:

Cajero automático: cuando el titular de la cuenta intenta retirar dinero del servidor a través de un cajero automático, la información del titular de la cuenta, como los detalles del retiro, se serializará y enviará al servidor donde los detalles se deserializan y se utilizan para realizar operaciones.

Cómo se realiza la serialización en java.

  1. Implementar java.io.Serializableinterfaz (interfaz de marcador, por lo que no hay ningún método para implementar).

  2. Conservar el objeto: use java.io.ObjectOutputStreamuna clase, una secuencia de filtro que envuelve una secuencia de bytes de nivel inferior (para escribir objetos en sistemas de archivos o transferir un objeto aplanado a través de un cable de red y reconstruido en el otro lado).

  • writeObject(<<instance>>)- escribir un objeto
  • readObject() - para leer un objeto serializado

Recordar:

Cuando serializa un objeto, solo se guardará el estado del objeto, no el archivo de clase ni los métodos del objeto.

Cuando serializa un objeto de 2 bytes, ve un archivo serializado de 51 bytes.

Detalla cómo se serializa y deserializa el objeto.

Respuesta para: ¿Cómo se convirtió a un archivo de 51 bytes?

  • Primero escribe los datos mágicos del flujo de serialización (STREAM_MAGIC= "AC ED" y STREAM_VERSION=versión de la JVM).
  • Luego escribe los metadatos de la clase asociada con una instancia (longitud de la clase, nombre de la clase, serialVersionUID).
  • Luego escribe recursivamente los metadatos de la superclase hasta que encuentra java.lang.Object.
  • Luego comienza con los datos reales asociados con la instancia.
  • Finalmente escribe los datos de los objetos asociados con la instancia, desde los metadatos hasta el contenido real.

También puedes consultar mi vídeo explicativo de Youtube aquí.

Editar : enlace de referencia para leer.

Esto responderá algunas preguntas frecuentes:

  1. Cómo no serializar ningún campo de la clase.
    Respuesta: use palabra clave transitoria

  2. Cuando se serializa la clase secundaria, ¿se serializa la clase principal?
    Respuesta: No, si un padre no extiende el campo de padres de la interfaz serializable, no se serializa.

  3. Cuando se serializa un padre, ¿se serializa la clase secundaria?
    Respuesta: Sí, de forma predeterminada la clase secundaria también se serializa.

  4. ¿Cómo evitar que la clase secundaria se serialice?
    Respuesta: a. Anule los métodos writeObject y readObject y arroje NotSerializableException.

    b. También puede marcar todos los campos como transitorios en la clase secundaria.

  5. Algunas clases a nivel de sistema, como Thread, OutputStream y sus subclases, y Socket no son serializables.

VedantK avatar Sep 17 '2015 04:09 VedantK