Frage Warum hat Java transiente Felder?


Warum hat Java? vorübergehend Felder?


1202
2018-05-26 12:11


Ursprung


Antworten:


Das transient Schlüsselwort in Java wird verwendet, um anzugeben, dass ein Feld nicht serialisiert werden sollte.

Von dem Java-Sprachspezifikation, Java SE 7 Edition, Abschnitt 8.3.1.3. transient Felder:

Variablen können markiert sein transient zu   weisen darauf hin, dass sie nicht Teil der   persistenter Zustand eines Objekts.

Beispielsweise können Sie Felder haben, die von anderen Feldern abgeleitet sind, und sollten dies nur programmgesteuert tun, statt den Status über die Serialisierung beibehalten zu lassen.

Hier ist ein GalleryImage Klasse, die ein Bild und ein aus dem Bild abgeleitetes Thumbnail enthält:

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

In diesem Beispiel thumbnailImage ist ein Miniaturbild, das beim Aufruf von generateThumbnail Methode.

Das thumbnailImage Feld ist als markiert transient, also nur das Original image wird serialisiert, anstatt das Originalbild und das Miniaturbild zu erhalten. Dies bedeutet, dass weniger Speicher benötigt wird, um das serialisierte Objekt zu speichern. (Dies ist natürlich abhängig von den Anforderungen des Systems wünschenswert oder nicht - dies ist nur ein Beispiel.)

Zum Zeitpunkt der Deserialisierung hat die readObject Die Methode wird aufgerufen, um alle Operationen auszuführen, die erforderlich sind, um den Status des Objekts in den Zustand zurückzusetzen, in dem die Serialisierung stattgefunden hat. Hier muss das Thumbnail erzeugt werden, also der readObject Methode wird überschrieben, so dass das Thumbnail durch Aufrufen des generateThumbnail Methode.

Für weitere Informationen, die Entdecken Sie die Geheimnisse der Java-Serialisierungs-API Artikel (der ursprünglich im Sun Developer Network verfügbar war) enthält einen Abschnitt, in dem die Verwendung von und ein Szenario vorgestellt wird, in dem der transient Schlüsselwort wird verwendet, um die Serialisierung bestimmter Felder zu verhindern.


1413
2018-05-26 12:53



Bevor ich das verstehe transient Stichwort muss man das Konzept der Serialisierung verstehen. Wenn der Leser über die Serialisierung informiert ist, überspringen Sie bitte den ersten Punkt.

Was ist Serialisierung?

Bei der Serialisierung wird der Status des Objekts persistent gemacht. Das heißt, der Status des Objekts wird in einen Bytestrom umgewandelt und in einer Datei gespeichert. Auf die gleiche Weise können wir die Deserialisierung verwenden, um den Status des Objekts aus Bytes zurückzuholen. Dies ist eines der wichtigsten Konzepte in der Java-Programmierung, da die Serialisierung hauptsächlich in der Netzwerkprogrammierung verwendet wird. Die Objekte, die über das Netzwerk übertragen werden sollen, müssen in Bytes konvertiert werden. Zu diesem Zweck muss jede Klasse oder Schnittstelle die Serializable Schnittstelle. Es ist eine Marker-Schnittstelle ohne irgendwelche Methoden.

Nun, was ist das? transient Stichwort und seinen Zweck?

Standardmäßig werden alle Variablen des Objekts in einen dauerhaften Zustand konvertiert. In einigen Fällen möchten Sie möglicherweise einige Variablen nicht beibehalten, da Sie diese Variablen nicht beibehalten müssen. So können Sie diese Variablen als deklarieren transient. Wenn die Variable als deklariert ist transient, dann wird es nicht bestehen bleiben. Das ist der Hauptzweck des transient Stichwort.

Ich möchte die obigen zwei Punkte mit dem folgenden Beispiel erklären:

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

Und die Ausgabe wird die folgenden sein:

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

Zweiter Vorname wird als deklariert transient, so wird es nicht im persistenten Speicher gespeichert.

Quelle


354
2018-05-26 12:13



Damit Sie Variablen definieren können, die Sie nicht serialisieren möchten.

In einem Objekt haben Sie möglicherweise Informationen, die Sie nicht serialisieren / persistieren möchten (vielleicht eine Referenz auf ein Eltern-Factory-Objekt), oder vielleicht macht es keinen Sinn, sie zu serialisieren. Wenn diese als "vorübergehend" gekennzeichnet werden, bedeutet dies, dass der Serialisierungsmechanismus diese Felder ignoriert.


80
2018-03-18 22:04



Mein kleiner Beitrag:

Was ist eine transiente Variable in Java?
Im einfachen Satz wird jede Variable, die mit einem transienten Schlüsselwort modifiziert wird, in java zur transienten Variable.

Warum brauchen wir transiente Variable in Java?
Ein transientes Schlüsselwort bietet Ihnen eine gewisse Kontrolle über den Serialisierungsprozess und gibt Ihnen die Flexibilität, einige der Objekteigenschaften vom Serialisierungsprozess auszuschließen. Manchmal macht es Sinn, bestimmte Attribute eines Objekts nicht zu serialisieren, wir werden sehen, welche Variablen nicht serialisiert werden sollten und im nächsten Abschnitt transient gemacht werden sollten.

Welche Variable solltest du transient markieren?
Da wir den Zweck eines vorübergehenden Schlüsselworts kennen oder transiente Variable haben, ist es sinnvoll, darüber nachzudenken, welche Variable als vorübergehend markiert werden sollte. Meine Regel ist, dass jede Variable, deren Wert aus anderen Variablen berechnet werden kann, nicht gespeichert werden muss. Zum Beispiel, wenn Sie ein Feld namens "interest" haben, dessen Wert aus anderen Feldern wie z. Prinzip, Rate, Zeit etc, dann gibt es keine Notwendigkeit, es zu serialisieren.
Ein weiteres Beispiel ist die Wortzählung. Wenn Sie Artikel speichern, müssen Sie die Wortzahl nicht speichern, da sie erstellt werden kann, wenn der Artikel deserialisiert wird. Ein anderes gutes Beispiel für vorübergehendes Schlüsselwort ist "Logger", da Sie meistens eine Logger-Instanz für die Anmeldung in Java haben, aber Sie wollen sicher nicht, dass es korrekt serialisiert?


27
2018-05-26 12:15



EIN transient Variable ist eine Variable, die nicht serialisiert werden kann.

Ein Beispiel, wenn dies nützlich sein könnte, sind Variablen, die nur im Kontext einer bestimmten Objektinstanz Sinn machen und die nach der Serialisierung und Deserialisierung des Objekts ungültig werden. In diesem Fall ist es nützlich, dass diese Variablen werden null Stattdessen können Sie sie bei Bedarf mit nützlichen Daten neu initialisieren.


21
2018-03-26 14:16



transient wird verwendet, um anzuzeigen, dass ein Klassenfeld nicht serialisiert werden muss. Das wahrscheinlich beste Beispiel ist ein Thread Feld. Es gibt normalerweise keinen Grund, eine zu serialisieren Thread, da sein Zustand sehr "strömungsspezifisch" ist.


13
2018-05-26 12:15



Weil nicht alle Variablen serialisierbar sind


10
2018-05-28 02:20



Andere Serialisierungssysteme als das native Java können diesen Modifikator auch verwenden. Hibernate beispielsweise behält Felder, die mit beiden markiert sind, nicht bei @Transient oder der vorübergehendModifikator. Auch Terrakotta respektiert diesen Modifikator.

Ich glaube, die bildliche Bedeutung des Modifikators ist "dieses Feld ist nur für den In-Memory-Gebrauch. Behalten Sie es nicht oder bewegen Sie es außerhalb dieser bestimmten VM in keiner Weise. Es ist nicht tragbar". Sie können sich nicht auf seinen Wert in einem anderen VM-Speicherbereich verlassen. Ähnlich wie flüchtig bedeutet, dass Sie sich nicht auf bestimmte Speicher- und Thread-Semantiken verlassen können.


10
2017-12-22 08:20