Warum hat Java transient Felder?
Antworten
Zu viele Anzeigen?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.
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.
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.
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.
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.
- See previous answers
- Weitere Antworten anzeigen