Question Pourquoi Java a-t-il des champs transitoires?


Pourquoi Java a-t-il transitoire des champs?


1202
2018-05-26 12:11


origine


Réponses:


le transient mot-clé en Java est utilisé pour indiquer qu'un champ ne doit pas être sérialisé.

Du Spécification de langage Java, Java SE 7 Edition, Section 8.3.1.3. transient Des champs:

Les variables peuvent être marquées transient à   indiquer qu'ils ne font pas partie de la   état persistant d'un objet.

Par exemple, vous pouvez avoir des champs dérivés d'autres champs, et cela uniquement par programmation, plutôt que de laisser l'état persister via la sérialisation.

Voici un GalleryImage classe qui contient une image et une miniature dérivée de l'image:

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();
    }    
}

Dans cet exemple, le thumbnailImage est une image miniature générée en invoquant le generateThumbnail méthode.

le thumbnailImage le champ est marqué comme transient, donc seulement l'original image est sérialisé plutôt que de persister à la fois l'image originale et l'image miniature. Cela signifie que moins de stockage sera nécessaire pour enregistrer l'objet sérialisé. (Bien sûr, cela peut ou non être souhaitable selon les exigences du système - ce n'est qu'un exemple.)

Au moment de la désérialisation, le readObject méthode est appelée pour effectuer toutes les opérations nécessaires pour restaurer l'état de l'objet à l'état où la sérialisation s'est produite. Ici, la vignette doit être générée, de sorte que le readObject méthode est substituée de sorte que la vignette sera générée en appelant le generateThumbnail méthode.

Pour plus d'informations, le Découvrez les secrets de l'API Java Serialization article (qui était disponible à l'origine sur le Sun Developer Network) a une section qui traite de l'utilisation de et présente un scénario où le transient Le mot-clé est utilisé pour empêcher la sérialisation de certains champs.


1413
2018-05-26 12:53



Avant de comprendre le transient mot-clé, il faut comprendre le concept de sérialisation. Si le lecteur connaît la sérialisation, ignorez le premier point.

Qu'est-ce que la sérialisation?

La sérialisation est le processus consistant à rendre l'état de l'objet persistant. Cela signifie que l'état de l'objet est converti en un flux d'octets et stocké dans un fichier. De la même manière, nous pouvons utiliser la désérialisation pour ramener l'état de l'objet à partir des octets. C'est l'un des concepts importants de la programmation Java, car la sérialisation est principalement utilisée dans la programmation en réseau. Les objets qui doivent être transmis à travers le réseau doivent être convertis en octets. À cette fin, chaque classe ou interface doit mettre en œuvre Serializable interface. C'est une interface de marqueur sans aucune méthode.

Maintenant, quel est le transient mot-clé et son but?

Par défaut, toutes les variables de l'objet sont converties en un état persistant. Dans certains cas, vous pouvez éviter de conserver certaines variables car vous n'avez pas besoin de les conserver. Vous pouvez donc déclarer ces variables comme transient. Si la variable est déclarée comme transient, alors il ne sera pas persisté. C'est le but principal de la transient mot-clé.

Je veux expliquer les deux points ci-dessus avec l'exemple suivant:

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);
    }
}

Et la sortie sera la suivante:

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

Deuxième nom est déclaré comme transient, donc il ne sera pas stocké dans le stockage persistant.

La source


354
2018-05-26 12:13



Pour vous permettre de définir des variables que vous ne voulez pas sérialiser.

Dans un objet, vous pouvez avoir des informations que vous ne voulez pas sérialiser / persister (peut-être une référence à un objet fabrique parent), ou peut-être que cela n'a pas de sens de sérialiser. Les marquer comme "transitoires" signifie que le mécanisme de sérialisation ignorera ces champs.


80
2018-03-18 22:04



Ma petite contribution:

Quelle est la variable transitoire en Java?
En simple phrase toute variable qui est modifiée avec le mot-clé transitoire devient variable transitoire en Java.

Pourquoi avons-nous besoin d'une variable transitoire en Java?
Le mot clé Transient vous permet de contrôler le processus de sérialisation et vous permet d'exclure certaines propriétés d'objet du processus de sérialisation. Il est parfois utile de ne pas sérialiser certains attributs d'un objet, nous verrons quelles variables ne devraient pas être sérialisées et devraient être rendues transitoires dans la section suivante.

Quelle variable vous devriez marquer transitoire?
Puisque nous connaissons le but du mot-clé transitoire ou que nous avons une variable transitoire, il est logique de penser à quelle variable doit être marquée comme transitoire. Ma règle est que toute variable dont la valeur peut être calculée à partir d'autres variables n'a pas besoin d'être sauvegardée. Par exemple, si vous avez un champ appelé "intérêt" dont la valeur peut être dérivée d'autres champs, par ex. principe, taux, temps etc. alors il n'y a pas besoin de le sérialiser.
Un autre exemple est le nombre de mots, si vous enregistrez un article, il n'est pas nécessaire d'enregistrer le nombre de mots, car il peut être créé lorsque l'article est désérialisé. Un autre bon exemple de mot-clé transitoire est "Logger" puisque la plupart du temps vous avez une instance de logger pour vous connecter en Java mais vous ne voulez certainement pas qu'il sérialise correctement?


27
2018-05-26 12:15



UNE transient variable est une variable qui ne peut pas être sérialisée.

Un exemple de ce qui vient à l'esprit est celui des variables qui ne font sens que dans le contexte d'une instance d'objet spécifique et qui deviennent invalides une fois que vous avez sérialisé et désérialisé l'objet. Dans ce cas, il est utile que ces variables deviennent null au lieu de cela, vous pouvez les réinitialiser avec des données utiles si nécessaire.


21
2018-03-26 14:16



transient est utilisé pour indiquer qu'un champ de classe n'a pas besoin d'être sérialisé. Probablement le meilleur exemple est un Thread champ. Il n'y a généralement aucune raison de sérialiser Thread, car son état est très «spécifique au flux».


13
2018-05-26 12:15



Parce que toutes les variables ne sont pas de nature sérialisable


10
2018-05-28 02:20



Les systèmes de sérialisation autres que Java peuvent également utiliser ce modificateur. Hibernate, par exemple, ne conservera pas les champs marqués avec @Transitoire ou la transitoiremodificateur. La terre cuite respecte aussi ce modificateur.

Je crois que la signification figurative du modificateur est "ce champ est pour une utilisation en mémoire seulement, ne pas persister ou le déplacer en dehors de cette VM particulière de quelque façon que ce soit. c'est-à-dire que vous ne pouvez pas compter sur sa valeur dans un autre espace mémoire VM. Un peu comme volatil signifie que vous ne pouvez pas compter sur une certaine sémantique de la mémoire et des threads.


10
2017-12-22 08:20