Pregunta ¿Por qué Java tiene campos transitorios?


¿Por qué Java tiene transitorio ¿campos?


1202
2018-05-26 12:11


origen


Respuestas:


los transient la palabra clave en Java se usa para indicar que un campo no debe ser serializado.

Desde el Especificación del lenguaje Java, Java SE 7 Edition, Sección 8.3.1.3. transient Campos:

Las variables pueden ser marcadas transient a   indican que no son parte de la   estado persistente de un objeto.

Por ejemplo, puede tener campos que se derivan de otros campos, y solo se debe hacer de forma programática, en lugar de que el estado se mantenga a través de la serialización.

Aquí está un GalleryImage clase que contiene una imagen y una miniatura derivada de la imagen:

class GalleryImage implements Serializable
{
    private Image image;
    private transient Image thumbnailImage;

    private void generateThumbnail()
    {
        // Generate thumbnail.
    }

    private void readObject(ObjectInputStream inputStream)
            throws IOException, ClassNotFoundException
    {
        inputStream.defaultReadObject();
        generateThumbnail();
    }    
}

En este ejemplo, el thumbnailImage es una imagen en miniatura que se genera al invocar el generateThumbnail método.

los thumbnailImage el campo está marcado como transient, entonces solo el original image se serializa en lugar de persistir tanto en la imagen original como en la imagen en miniatura. Esto significa que se necesitaría menos almacenamiento para guardar el objeto serializado. (Por supuesto, esto puede o no ser deseable según los requisitos del sistema; esto es solo un ejemplo).

En el momento de la deserialización, el readObject se llama al método para realizar cualquier operación necesaria para restablecer el estado del objeto al estado en el que se produjo la serialización. Aquí, la miniatura debe ser generada, por lo que readObject método se anula para que la miniatura se generará llamando al generateThumbnail método.

Para información adicional, el Descubre los secretos de la API de serialización de Java El artículo (que originalmente estaba disponible en Sun Developer Network) tiene una sección que analiza el uso de y presenta un escenario donde transient la palabra clave se usa para evitar la serialización de ciertos campos.


1413
2018-05-26 12:53



Antes de entender el transient palabra clave, uno tiene que entender el concepto de serialización. Si el lector conoce la serialización, omita el primer punto.

¿Qué es la serialización?

La serialización es el proceso de hacer que el estado del objeto sea persistente. Eso significa que el estado del objeto se convierte en una secuencia de bytes y se almacena en un archivo. De la misma manera, podemos utilizar la deserialización para recuperar el estado del objeto desde bytes. Este es uno de los conceptos importantes en la programación de Java porque la serialización se utiliza principalmente en la programación de redes. Los objetos que deben transmitirse a través de la red deben convertirse en bytes. Para ese propósito, cada clase o interfaz debe implementar el Serializable interfaz. Es una interfaz de marcador sin ningún método.

Ahora que es el transient palabra clave y su propósito?

Por defecto, todas las variables del objeto se convierten en un estado persistente. En algunos casos, es posible que desee evitar persistir algunas variables porque no tiene la necesidad de mantener esas variables. Entonces puedes declarar esas variables como transient. Si la variable se declara como transient, entonces no se mantendrá. Ese es el objetivo principal de la transient palabra clave.

Quiero explicar los dos puntos anteriores con el siguiente ejemplo:

package javabeat.samples;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

class NameStore implements Serializable{
    private String firstName;
    private transient String middleName;
    private String lastName;

    public NameStore (String fName, String mName, String lName){
        this.firstName = fName;
        this.middleName = mName;
        this.lastName = lName;
    }

    public String toString(){
        StringBuffer sb = new StringBuffer(40);
        sb.append("First Name : ");
        sb.append(this.firstName);
        sb.append("Middle Name : ");
        sb.append(this.middleName);
        sb.append("Last Name : ");
        sb.append(this.lastName);
        return sb.toString();
    }
}

public class TransientExample{
    public static void main(String args[]) throws Exception {
        NameStore nameStore = new NameStore("Steve", "Middle","Jobs");
        ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream("nameStore"));
        // writing to object
        o.writeObject(nameStore);
        o.close();

        // reading from object
        ObjectInputStream in = new ObjectInputStream(new FileInputStream("nameStore"));
        NameStore nameStore1 = (NameStore)in.readObject();
        System.out.println(nameStore1);
    }
}

Y la salida será la siguiente:

First Name : Steve
Middle Name : null
Last Name : Jobs

Segundo nombre se declara como transient, por lo que no se almacenará en el almacenamiento persistente.

Fuente


354
2018-05-26 12:13



Para permitirle definir variables que no desea serializar.

En un objeto puede tener información que no desea serializar / persistir (tal vez una referencia a un objeto de fábrica principal), o tal vez no tenga sentido realizar la serialización. Marcar estos como 'transitorios' significa que el mecanismo de serialización ignorará estos campos.


80
2018-03-18 22:04



Mi pequeña contribución:

¿Qué es la variable transitoria en Java?
En una oración simple, cualquier variable que se modifique con la palabra clave transitoria se convierte en variable transitoria en java.

¿Por qué necesitamos una variable transitoria en Java?
La palabra clave transitoria le proporciona cierto control sobre el proceso de serialización y le brinda flexibilidad para excluir algunas de las propiedades del objeto del proceso de serialización. En algún momento tiene sentido no serializar ciertos atributos de un objeto, veremos qué variables no deberían ser serializadas y deberían hacerse transitorias en la próxima sección.

¿Qué variable debe marcar transitoria?
Dado que conocemos el propósito de la palabra clave transitoria o que tiene una variable transitoria, tiene sentido pensar qué variable debe marcarse como transitoria. Mi regla es que cualquier variable cuyo valor se puede calcular a partir de otras variables no requiere ser guardada. Por ejemplo, si tiene un campo llamado "interés" cuyo valor puede derivarse de otros campos, p. principio, tasa, tiempo, etc., entonces no hay necesidad de serializarlo.
Otro ejemplo es el recuento de palabras, si está guardando un artículo, entonces no es necesario guardar el conteo de palabras, ya que se puede crear cuando el artículo se deserializa. Otro buen ejemplo de palabra clave transitoria es "Logger", ya que la mayoría de las veces tiene una instancia de registrador para iniciar sesión en Java, pero ciertamente no desea que la serialización sea correcta.


27
2018-05-26 12:15



UN transient variable es una variable que puede no ser serializada.

Un ejemplo de cuándo esto podría ser útil que viene a la mente es, variables que solo tienen sentido en el contexto de una instancia de objeto específica y que se vuelven inválidas una vez que haya serializado y deserializado el objeto. En ese caso, es útil que esas variables se conviertan null en su lugar, para que pueda reinicializarlos con datos útiles cuando sea necesario.


21
2018-03-26 14:16



transient se usa para indicar que un campo de clase no necesita ser serializado. Probablemente el mejor ejemplo es un Thread campo. Por lo general, no hay razón para serializar un Thread, ya que su estado es muy 'específico de flujo'.


13
2018-05-26 12:15



Porque no todas las variables son de naturaleza serializable


10
2018-05-28 02:20