English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

¿Se almacenan los valores de las variables estáticas durante la serialización de objetos en Java?

Texto

Serialización de objeto-

  • En Java, la serialización es un concepto a través del cual podemos escribir el estado del objeto en un flujo de bytes, de modo que podemos transmitirlo a través de la red (usando tecnologías como JPA y RMI).

  • Crear unaFileOutputStreamAsegúrese de que esta clase implemente la interfaz Serializable.

  • Al pasar el objeto que representa el archivo al que se va a almacenar el objeto (ruta abstracta).FileOutputStreamObjeto para crear un objeto ObjectOutputStream.

  • Escribir un objeto en el archivo usando el método writeObject().

Deserialización de objeto

  • Crear unaFileInputStreamObjeto, que representa el archivo que contiene el objeto serializado.

  • Leer un objeto desde un archivo usando el método readObject().

  • Usar el objeto obtenido.

Variables del objeto deserializado

Cuando solo deserializamos un objeto, las variables de instancia se guardarán y tendrán los mismos valores después de este proceso.

Las variables transitorias  - Nunca consideraréLas variables transitoriassus valores (excluyéndolos del proceso de serialización). Por ejemplo, cuando declaramos una variable transitoria, después de la deserialización, su valor siempre será null, false o cero (valor por defecto).

Las variables estáticas  - no se conservarán durante el proceso de desserializaciónLas variables estáticaslos valores. De hecho, las variables estáticas no se serializan, pero porque pertenecen a la clase. Después de la deserialización, obtienen los valores actuales de la clase.

Ejemplo

En este programa, cambiamos los valores de la instancia, las variables estáticas y transitorias de la clase antes de la desserialización.

Después de este proceso, los valores de las variables de instancia serán idénticos. Las variables temporales mostrarán los valores por defecto, mientras que las variables estáticas mostrarán los nuevos (actuales) valores de la clase.

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
class Student implements Serializable{
   private String name;
   private transient int age;
   private static int year = 2018;
   public Student(){
      System.out.println("This is a constructor");
      this.name = "Krishna";
      this.age = 25;
   }
   public Student(String name, int age){
      this.name = name;
      this.age = age;
   }
   public void display() {
      System.out.println("Name: ",+this.name);
      System.out.println("Age: ",+this.age);
      System.out.println("Year: ",+Student.year);
   }
   public void setName(String name) {
      this.name = name;
   }
   public void setAge(int age) {
      this.age = age;
   }
   public void setYear(int year) {
      Student.year = year;
   }
}
public class SerializeExample{
   public static void main(String args[]) throws Exception{
      //Crear un objeto Student
      Student std = new Student("Vani", 27);
      //Serialización de objeto
      FileOutputStream fos = new FileOutputStream("e:\\student.ser");
      ObjectOutputStream oos = new ObjectOutputStream(fos);
      oos.writeObject(std);
      oos.close();
      fos.close();
      //Imprimir datos antes de la deserialización
      System.out.println("Valor antes de la deserialización:");
      std.display();
      //Cambiar el valor del variable estático
      std.setYear(2019);
      //Cambiar el valor del variable de instancia
      std.setName("Varada");
      //Cambiar el valor del variable de instancia
      std.setAge(19);
      System.out.println("Objeto serializado......");
      //Deserialización de objeto
      FileInputStream fis = new FileInputStream("e:\\student.ser");
      ObjectInputStream ois = new ObjectInputStream(fis);
      Student deSerializedStd = (Student) ois.readObject();
      System.out.println("Objeto de-serializado......");
      ois.close();
      fis.close();
      System.out.println("Valor después de la deserialización:");
      deSerializedStd.display();
   }
}

Resultado de salida

Valor antes de la deserialización:
Nombre: Vani
Edad: 27
Año: 2018
Objeto serializado......
Objeto de-serializado......
Valor después de la deserialización:
Nombre: Vani
Edad: 0
Año: 2019