0Pricing
Java Academy · Lección

Campos transient y serialVersionUID

Excluya campos sensibles con transient y mantenga la compatibilidad entre versiones con serialVersionUID.

Campos transient y serialVersionUID es una lección gratuita de Java Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Java Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Java Academy incluye 4 lecciones en total.

¿Por qué transient?

Algunos campos no deben guardarse: contraseñas, manejadores de archivos abiertos o cálculos almacenados en caché. Márquelos como transient y se omitirán durante la serialización.

public class Session implements Serializable {
    private String username;
    private transient String password;   // NOT serialized
    private transient Connection dbConn; // NOT serialized
}

Valor de un campo transient después de la deserialización

Después de la deserialización, los campos transient reciben el valor predeterminado de Java: null para los objetos, 0 para los números y false para los booleanos.

Session s = (Session) ois.readObject();
System.out.println(s.username);  // "alice"
System.out.println(s.password);  // null  (transient)

¿Qué es serialVersionUID?

serialVersionUID es una constante long que actúa como una marca de versión. Si la clase cambia y el UID no coincide con el del archivo, la deserialización lanza InvalidClassException.

public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;
}

UID generado automáticamente frente a UID explícito

Si omite serialVersionUID, Java genera uno a partir de la estructura de la clase. Cualquier cambio en un campo modifica silenciosamente el UID y rompe los datos antiguos. Declárelo siempre de forma explícita.

import java.io.ObjectStreamClass;
long uid = ObjectStreamClass.lookup(User.class).getSerialVersionUID();
System.out.println(uid); // e.g. 3526749255685047947

InvalidClassException por incompatibilidad de versiones

Al leer datos serializados antiguos con una clase cuyo UID ha cambiado, Java lanza InvalidClassException: local class incompatible: stream classdesc serialVersionUID = X, local class serialVersionUID = Y.

Evolución segura de clases

Puede añadir nuevos campos de forma segura a una clase serializable sin cambiar el UID. Los flujos antiguos se deserializarán con el nuevo campo establecido en su valor predeterminado. Eliminar o cambiar el nombre de campos es más peligroso.

public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;
    private String email; // Added in v2 — safe if UID unchanged
}

transient con inicialización diferida

Un patrón habitual consiste en marcar como transient un campo almacenado en caché o derivado y volver a calcularlo de forma diferida después de la deserialización mediante readResolve o en el getter.

public class Document implements Serializable {
    private static final long serialVersionUID = 1L;
    private String content;
    private transient int wordCount = -1;
    public int getWordCount() {
        if (wordCount == -1) wordCount = content.split("\\s+").length;
        return wordCount;
    }
}

Los campos static nunca se serializan

Los campos static pertenecen a la clase, no a la instancia. Nunca se incluyen en el flujo serializado; solo se serializan los campos de instancia.

public class Counter implements Serializable {
    private static final long serialVersionUID = 1L;
    private static int instanceCount = 0; // NOT serialized
    private int value;
}

Uso de la herramienta serialver

La herramienta del JDK serialver muestra el serialVersionUID predeterminado de una clase: serialver com.example.User. Utilícela para obtener el valor antes de añadirlo explícitamente.

Externalizable como alternativa

Externalizable extiende Serializable y ofrece control total mediante writeExternal / readExternal; resulta útil cuando desea controlar explícitamente los campos sin usar transient.

public class Config implements Externalizable {
    private String host;
    private transient String secret;
    public void writeExternal(ObjectOutput out) throws IOException {
        out.writeUTF(host);
    }
    public void readExternal(ObjectInput in) throws IOException {
        host = in.readUTF();
    }
}

Prácticas recomendadas

Declare siempre serialVersionUID. Marque las contraseñas, los manejadores y las cachés como transient. Incremente el UID al realizar cambios incompatibles. Documente el historial de versiones.

Comprobación rápida

¿Qué valor tiene un campo int marcado como transient después de la deserialización?

Repaso

Use transient para excluir campos de la serialización. Declare siempre serialVersionUID para controlar las versiones. Los campos estáticos nunca se serializan, sin importar las circunstancias.

Preguntas frecuentes

¿La lección «Campos transient y serialVersionUID» es gratis?

Sí — el texto completo de «Campos transient y serialVersionUID» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Java Academy, actualiza a CoddyKit PRO. El curso de Java Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Campos transient y serialVersionUID»?

Excluya campos sensibles con transient y mantenga la compatibilidad entre versiones con serialVersionUID. Practicas Java Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Java Academy?

No se requiere experiencia previa. Java Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.

¿Cuánto tiempo toma la lección «Campos transient y serialVersionUID»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Java Academy?

Sí. Cada lección de Java Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Fundamentos de la serialización en Java
  2. Campos transient y serialVersionUID
  3. Serialización personalizada: writeObject y readObject
  4. Alternativas modernas: JSON y Protocol Buffers
← Volver a Java Academy