Ach, obwohl ich mit Java am besten vertraut bin, gibt es viele grundlegende Java-Wissenspunkte, die ich nicht kenne. Zum Beispiel hatte ich das Schlüsselwort transient noch nie verwendet, also wusste ich nicht, was es bewirkt. Heute, während ich einen schriftlichen Test machte, fand ich eine Frage dazu, also nahm ich mir etwas Zeit, um die Verwendung des Schlüsselworts transient zu ordnen und mein Wissen zu erweitern~~~ Na gut, genug Unsinn, fangen wir unten an:
1. Funktion und Verwendung von transient
Wir alle wissen, dass ein Objekt serialisiert werden kann, solange es das Interface Serializable implementiert. Der Serialisierungsmodus von Java bietet Entwicklern viele Annehmlichkeiten. Wir müssen uns nicht um den konkreten Serialisierungsprozess kümmern; solange die Klasse das Interface Serializable implementiert, werden alle Eigenschaften und Methoden der Klasse automatisch serialisiert.
In der tatsächlichen Entwicklung stoßen wir jedoch oft auf dieses Problem: Einige Eigenschaften einer Klasse müssen serialisiert werden, während andere Eigenschaften nicht. Wenn ein Benutzer beispielsweise einige sensible Informationen hat (wie Passwörter, Bankkartennummern usw.), möchten wir aus Sicherheitsgründen nicht, dass sie während Netzwerkoperationen übertragen werden (hauptsächlich Serialisierungsvorgänge betreffend; lokales Serialisierungs-Caching gilt ebenfalls). Die Variablen, die diesen Informationen entsprechen, können mit dem Schlüsselwort transient markiert werden. Mit anderen Worten: Der Lebenszyklus dieses Feldes existiert nur im Speicher des Aufrufers und wird nicht zur Persistenz auf die Festplatte geschrieben.
Kurz gesagt, das Schlüsselwort transient von Java bietet uns Komfort. Sie müssen nur das Interface Serializable implementieren und das Schlüsselwort transient vor den Attributen hinzufügen, die nicht serialisiert werden müssen. Beim Serialisieren des Objekts wird dieses Attribut nicht an das angegebene Ziel serialisiert.
Beispiel
Ausgabe ist:
read before Serializable: username: Alexia password: 123456 read after Serializable: username: Alexia password: null
Das Passwortfeld ist null, was darauf hindeutet, dass während der Deserialisierung keine Informationen aus der Datei abgerufen wurden.
2. Zusammenfassung der Verwendung von transient
1) Sobald eine Variable durch transient modifiziert wird, ist die Variable nicht mehr Teil der Persistenz des Objekts, und auf den Inhalt der Variable kann nach der Serialisierung nicht mehr zugegriffen werden.
2) Das Schlüsselwort transient kann nur Variablen modifizieren, keine Methoden oder Klassen. Beachten Sie, dass lokale Variablen nicht durch das Schlüsselwort transient modifiziert werden können. Wenn die Variable eine benutzerdefinierte Klassenvariable ist, muss diese Klasse die Schnittstelle Serializable implementieren.
3) Eine durch das Schlüsselwort transient modifizierte Variable kann nicht mehr serialisiert werden. Eine statische Variable kann nicht serialisiert werden, unabhängig davon, ob sie durch transient modifiziert wird.
Manche Leute könnten über den dritten Punkt verwirrt sein, weil sie feststellen, dass nach dem Hinzufügen des Schlüsselworts static vor dem Feld username in der Klasse User die Programmausgabe unverändert bleibt; das heißt, der statische username wird ebenfalls als "Alexia" ausgelesen. Widerspricht das nicht dem dritten Punkt? Tatsächlich ist es so: Der dritte Punkt ist tatsächlich korrekt (eine statische Variable kann nicht serialisiert werden, unabhängig davon, ob sie durch transient modifiziert wird). Nach der Deserialisierung ist der Wert der statischen Variable username in der Klasse der Wert der entsprechenden statischen Variable in der aktuellen JVM. Dieser Wert stammt aus der JVM, nicht aus der Deserialisierung. Glauben Sie es nicht? Also gut, ich beweise es unten:
Beispiel
Das Ergebnis der Ausführung ist:
read before Serializable: username: Alexia password: 123456 read after Serializable: username: jmwang password: null
Dies zeigt, dass nach der Deserialisierung der Wert der statischen Variable username in der Klasse der Wert der entsprechenden statischen Variable in der aktuellen JVM ist, nämlich jmwang nach der Änderung, nicht der Wert Alexia aus der Serialisierung.
3. Details zur Verwendung von transient — Können durch das Schlüsselwort transient modifizierte Variablen wirklich nicht serialisiert werden?
Betrachten Sie das folgende Beispiel:
Beispiel
Wird die Variable content serialisiert? In Ordnung, ich habe die Antwort bereits ausgegeben. Ja, das Ausführungsergebnis ist:
是的,我将会被序列化,不管我是否被transient关键字修饰
Warum ist das so? Haben wir nicht gesagt, dass eine Klassenvariable, nachdem sie mit dem Schlüsselwort transient modifiziert wurde, nicht serialisiert werden kann?
Wir wissen, dass in Java die Objektserialisierung durch die Implementierung zweier Schnittstellen erreicht werden kann. Wenn die Schnittstelle Serializable implementiert wird, wird die gesamte Serialisierung automatisch durchgeführt. Wenn die Schnittstelle Externalizable implementiert wird, kann nichts automatisch serialisiert werden; Sie müssen die zu serialisierenden Variablen in der Methode writeExternal manuell angeben, unabhängig davon, ob sie durch transient modifiziert wurden. Daher ist im zweiten Beispiel die Ausgabe der initialisierte Inhalt der Variablen content, nicht null.
Quelle: http://www.cnblogs.com/lanxuezaipiao/p/3369962.html