1663 Stimmen

Warum gibt es in Java transiente Felder?

Warum hat Java transient Felder?

1835voto

coobird Punkte 155882

El transient Schlüsselwort in Java wird verwendet, um anzuzeigen, dass ein Feld nicht Teil des Serialisierungsprozesses (d.h. der Speicherung, z.B. in einer Datei) sein soll.

Von der Java Sprachspezifikation, Java SE 7 Ausgabe , Abschnitt 8.3.1.3. transient Felder :

Variablen können markiert werden transient zu darauf hinweisen, dass sie nicht Teil der persistenten Zustand eines Objekts sind.

Zum Beispiel können Sie Felder haben, die von anderen Feldern abgeleitet sind und die nur programmatisch bearbeitet werden sollten, anstatt den Zustand über Serialisierung zu erhalten.

Hier ist ein GalleryImage Klasse, die ein Bild und ein davon abgeleitetes Miniaturbild 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 ist die thumbnailImage ist ein Miniaturbild, das durch den Aufruf der Funktion generateThumbnail método.

El thumbnailImage Feld ist markiert als transient also nur das Original image serialisiert wird, anstatt sowohl das Originalbild als auch das Miniaturbild zu speichern. Dies bedeutet, dass für die Speicherung des serialisierten Objekts weniger Speicherplatz benötigt wird. (Natürlich kann dies je nach den Anforderungen des Systems wünschenswert sein oder nicht - dies ist nur ein Beispiel).

Zum Zeitpunkt der Deserialisierung wird die [readObject](http://java.sun.com/javase/6/docs/api/java/io/ObjectInputStream.html#readObject()) Methode wird aufgerufen, um alle notwendigen Operationen durchzuführen, um den Zustand des Objekts wieder in den Zustand zu versetzen, in dem die Serialisierung stattgefunden hat. In diesem Fall muss das Vorschaubild erzeugt werden, weshalb die Methode readObject Methode wird überschrieben, so dass die Miniaturansicht durch den Aufruf der generateThumbnail método.

Weitere Informationen finden Sie in dem Artikel Entdecken Sie die Geheimnisse der Java Serialization API (das 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 die transient Schlüsselwort wird verwendet, um die Serialisierung bestimmter Felder zu verhindern.

500voto

Rahul Saxena Punkte 657

Vor dem Verständnis des transient Schlüsselwort, muss man das Konzept der Serialisierung verstehen. Wenn der Leser über Serialisierung Bescheid weiß, kann er den ersten Punkt überspringen.

Was ist Serialisierung?

Bei der Serialisierung wird der Zustand des Objekts persistent gemacht. Das bedeutet, dass der Zustand des Objekts in einen Strom von Bytes umgewandelt wird, der für die Persistenz (z. B. Speicherung von Bytes in einer Datei) oder die Übertragung (z. B. Senden von Bytes über ein Netzwerk) verwendet werden kann. Auf die gleiche Weise können wir die Deserialisierung nutzen, um den Zustand des Objekts aus Bytes wiederherzustellen. 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 umgewandelt werden. Zu diesem Zweck muss jede Klasse oder Schnittstelle die Serializable Schnittstelle. Es handelt sich um eine Marker-Schnittstelle ohne Methoden.

Was ist nun die transient Schlüsselwort und dessen Zweck?

Standardmäßig werden alle Variablen des Objekts in einen dauerhaften Zustand umgewandelt. In manchen Fällen möchten Sie vielleicht die Persistenz einiger Variablen vermeiden, weil Sie diese Variablen nicht benötigen. Daher können Sie diese Variablen deklarieren als transient . Wenn die Variable deklariert ist als transient dann wird sie nicht beibehalten. Das ist der Hauptzweck der transient Stichwort.

Ich möchte die beiden oben genannten Punkte anhand des folgenden Beispiels erläutern (entlehnt aus dieser Artikel ):

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

Die Ausgabe sieht dann wie folgt aus:

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

Mittlerer Name wird deklariert als transient und wird daher nicht im dauerhaften Speicher abgelegt.

91voto

Brian Agnew Punkte 260470

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

In einem Objekt können Informationen enthalten sein, die nicht serialisiert/persistiert werden sollen (z. B. ein Verweis auf ein übergeordnetes Fabrikobjekt), oder es ist nicht sinnvoll, sie zu serialisieren. Wenn Sie diese Felder als "transient" markieren, bedeutet dies, dass der Serialisierungsmechanismus diese Felder ignoriert.

41voto

Shreyos Adikari Punkte 11989

Warum werden in Java transiente Felder benötigt?

El transient Schlüsselwort gibt Ihnen eine gewisse Kontrolle über den Serialisierungsprozess und ermöglicht es Ihnen, einige Objekteigenschaften von diesem Prozess auszuschließen. Der Serialisierungsprozess wird verwendet, um Java-Objekte zu persistieren, vor allem damit ihr Zustand erhalten bleibt, während sie übertragen werden oder inaktiv sind. Manchmal ist es sinnvoll, bestimmte Attribute eines Objekts nicht zu serialisieren.

Welche Felder sollten Sie als vergänglich markieren?

Jetzt, da wir den Zweck der transient Schlüsselwort und vergänglicher Felder ist es wichtig zu wissen, welche Felder als vergänglich gekennzeichnet werden sollen. Statische Felder werden auch nicht serialisiert, so dass das entsprechende Schlüsselwort ebenfalls ausreichen würde. Aber das könnte Ihr Klassendesign ruinieren; an dieser Stelle ist das transient kommt das Stichwort zur Rettung. Ich versuche nicht zuzulassen, dass Felder, deren Werte von anderen abgeleitet werden können, serialisiert werden, also markiere ich sie als transient. Wenn Sie ein Feld namens interest deren Wert aus anderen Feldern berechnet werden kann ( principal , rate & time ), ist es nicht notwendig, sie zu serialisieren.

Ein weiteres gutes Beispiel ist die Anzahl der Wörter in Artikeln. Wenn Sie einen ganzen Artikel speichern, ist es eigentlich nicht nötig, die Wortzahl zu speichern, da diese berechnet werden kann, wenn der Artikel "deserialisiert" wird. Oder denken Sie an Logger; Logger Instanzen müssen fast nie serialisiert werden, so dass sie transient gemacht werden können.

34voto

Adrian Grigore Punkte 32344

A transient Variable ist eine Variable, die bei der Serialisierung der Klasse nicht berücksichtigt wird.

Ein Beispiel, bei dem dies nützlich sein könnte, sind Variablen, die nur im Zusammenhang mit einer bestimmten Objektinstanz Sinn machen und die ungültig werden, sobald Sie das Objekt serialisiert und deserialisiert haben. In diesem Fall ist es nützlich, dass diese Variablen zu null so dass Sie sie bei Bedarf mit nützlichen Daten neu initialisieren können.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X