Was ist mit "Objektserialisierung" gemeint? Können Sie es bitte anhand einiger Beispiele erklären?
java
serialization
object-serialization
Krieger
quelle
quelle
Antworten:
Bei der Serialisierung wird ein Objekt in eine Reihe von Bytes konvertiert, sodass das Objekt problemlos in einem dauerhaften Speicher gespeichert oder über eine Kommunikationsverbindung gestreamt werden kann. Der Bytestream kann dann deserialisiert und in eine Replik des ursprünglichen Objekts konvertiert werden.
quelle
Sie können sich Serialisierung als den Prozess des Konvertierens einer Objektinstanz in eine Folge von Bytes vorstellen (die je nach Implementierung binär sein können oder nicht).
Dies ist sehr nützlich, wenn Sie Objektdaten über das Netzwerk übertragen möchten, beispielsweise von einer JVM zu einer anderen.
In Java ist der Serialisierungsmechanismus in die Plattform integriert, Sie müssen jedoch die serialisierbare Schnittstelle implementieren , um ein Objekt serialisierbar zu machen.
Sie können auch verhindern, dass einige Daten in Ihrem Objekt serialisiert werden, indem Sie das Attribut als vorübergehend markieren .
Schließlich können Sie den Standardmechanismus überschreiben und Ihren eigenen bereitstellen. Dies kann in einigen besonderen Fällen geeignet sein. Dazu verwenden Sie eine der versteckten Funktionen in Java .
Es ist wichtig zu beachten, dass der "Wert" des Objekts oder des Inhalts und nicht die Klassendefinition serialisiert wird. Daher werden Methoden nicht serialisiert.
Hier ist ein sehr einfaches Beispiel mit Kommentaren, um das Lesen zu erleichtern:
Wenn wir dieses Programm ausführen, wird die Datei "o.ser" erstellt und wir können sehen, was dahinter passiert ist.
Wenn wir den Wert von: someInteger in beispielsweise Integer.MAX_VALUE ändern , können wir die Ausgabe vergleichen , was der Unterschied ist.
Hier ist ein Screenshot, der genau diesen Unterschied zeigt:
Kannst du die Unterschiede erkennen? ;)
Es gibt ein zusätzliches relevantes Feld in der Java-Serialisierung: Die serialversionUID, aber ich denke, dies ist bereits zu lang, um sie abzudecken.
quelle
SerializationSample
SerializationSample instance = new SerializationSample();
Dann wird die Ausgabe erstellt und das Objekt in diese Ausgabe geschrieben.Ich wage es, die 6-jährige Frage zu beantworten, und füge nur ein sehr hohes Verständnis für Leute hinzu, die neu in Java sind
Konvertieren eines Objekts in Bytes
Bytes zurück in ein Objekt konvertieren (Deserialisierung).
Wenn wir das Objekt beibehalten wollen. Wenn wir möchten, dass das Objekt über die Lebensdauer der JVM hinaus existiert.
Geldautomat: Wenn der Kontoinhaber versucht, Geld über einen Geldautomaten vom Server abzuheben, werden die Kontoinhaberinformationen wie Auszahlungsdaten serialisiert und an den Server gesendet, wo die Daten deserialisiert und zur Durchführung von Vorgängen verwendet werden.
Implementieren
java.io.Serializable
(Markierungsschnittstelle, daher keine zu implementierende Methode).Behalten Sie das Objekt bei: Verwenden Sie
java.io.ObjectOutputStream
class, einen Filterstrom, der einen Wrapper um einen Byte-Stream niedrigerer Ebene darstellt (um Objekt in Dateisysteme zu schreiben oder ein abgeflachtes Objekt über eine Netzwerkleitung zu übertragen und auf der anderen Seite neu zu erstellen).writeObject(<<instance>>)
- um ein Objekt zu schreibenreadObject()
- um ein serialisiertes Objekt zu lesenWenn Sie ein Objekt serialisieren, wird nur der Status des Objekts gespeichert, nicht die Klassendatei oder Methoden des Objekts.
Wenn Sie ein 2-Byte-Objekt serialisiert haben, wird eine serialisierte 51-Byte-Datei angezeigt.
Antwort für: Wie wurde es in eine 51-Byte-Datei konvertiert?
java.lang.Object
.Bearbeiten : Noch ein guter Link zum Lesen.
Dies wird einige häufige Fragen beantworten:
So serialisieren Sie kein Feld in der Klasse.
Antwort: Verwenden Sie ein vorübergehendes Schlüsselwort
Wenn die untergeordnete Klasse serialisiert wird, wird die übergeordnete Klasse serialisiert?
Antwort: Nein, wenn ein übergeordnetes Element das übergeordnete Feld der serialisierbaren Schnittstelle nicht erweitert, wird es nicht serialisiert.
Wenn ein Elternteil serialisiert wird, wird die untergeordnete Klasse serialisiert?
Antwort: Ja, standardmäßig wird die untergeordnete Klasse auch serialisiert.
Wie kann verhindert werden, dass Kinderklassen serialisiert werden?
Ans: a. Überschreiben Sie die writeObject- und readObject-Methode und werfen Sie
NotSerializableException
.b. Sie können auch alle Felder markieren, die in der untergeordneten Klasse vorübergehend sind.
quelle
Bei der Serialisierung wird ein "lebendes" Objekt in den Speicher genommen und in ein Format konvertiert, das irgendwo gespeichert werden kann (z. B. im Speicher, auf der Festplatte) und später wieder in ein lebendes Objekt "deserialisiert" werden kann.
quelle
Mir hat die Art und Weise gefallen, wie @OscarRyz präsentiert. Obwohl ich hier die Geschichte der Serialisierung fortsetze, die ursprünglich von @amitgupta geschrieben wurde.
Obwohl die Wissenschaftler der Erde über die Struktur der Roboterklasse Bescheid wussten und Daten serialisiert hatten, waren sie nicht in der Lage, die Daten zu deserialisieren, die Roboter zum Funktionieren bringen können.
Die Wissenschaftler des Mars warteten auf die vollständige Zahlung. Sobald die Zahlung erfolgt war, teilten die Mars-Wissenschaftler die serialversionUID mit den Wissenschaftlern der Erde. Der Erdwissenschaftler stellte es auf Roboterklasse und alles wurde gut.
quelle
Serialisierung bedeutet, dass Objekte in Java beibehalten werden. Wenn Sie den Status des Objekts speichern und den Status später neu erstellen möchten (möglicherweise in einer anderen JVM), kann die Serialisierung verwendet werden.
Beachten Sie, dass die Eigenschaften eines Objekts nur gespeichert werden. Wenn Sie das Objekt erneut beleben möchten, sollten Sie über die Klassendatei verfügen, da nur die Elementvariablen gespeichert werden und nicht die Elementfunktionen.
z.B:
Das Searializable ist eine Markierungsschnittstelle, die markiert, dass Ihre Klasse serialisierbar ist. Markierungsschnittstelle bedeutet, dass es sich nur um eine leere Schnittstelle handelt. Wenn Sie diese Schnittstelle verwenden, wird die JVM benachrichtigt, dass diese Klasse serialisierbar gemacht werden kann.
quelle
Meine zwei Cent aus meinem eigenen Blog:
Hier ist eine detaillierte Erklärung der Serialisierung : (mein eigener Blog)
Serialisierung:
Bei der Serialisierung wird der Status eines Objekts beibehalten. Es wird in Form einer Folge von Bytes dargestellt und gespeichert. Dies kann in einer Datei gespeichert werden. Der Vorgang zum Lesen und Wiederherstellen des Status des Objekts aus der Datei wird als Deserialisierung bezeichnet.
Was ist die Notwendigkeit der Serialisierung?
In der modernen Architektur besteht immer die Notwendigkeit, den Objektstatus zu speichern und dann abzurufen. Zum Beispiel sollten wir im Ruhezustand zum Speichern eines Objekts die Klasse Serializable machen. Sobald der Objektstatus in Form von Bytes gespeichert ist, kann er auf ein anderes System übertragen werden, das dann aus dem Status lesen und die Klasse abrufen kann. Der Objektstatus kann aus einer Datenbank oder einem anderen JVM oder aus einer separaten Komponente stammen. Mit Hilfe der Serialisierung können wir den Objektstatus abrufen.
Codebeispiel und Erklärung:
Schauen wir uns zuerst die Gegenstandsklasse an:
Im obigen Code ist zu sehen, dass die Item- Klasse Serializable implementiert .
Dies ist die Schnittstelle, über die eine Klasse serialisierbar ist.
Jetzt können wir sehen, dass eine Variable namens serialVersionUID mit der Variablen Long initialisiert wird. Diese Zahl wird vom Compiler basierend auf dem Status der Klasse und den Klassenattributen berechnet. Dies ist die Nummer, mit der der JVM den Status eines Objekts identifizieren kann, wenn er den Status des Objekts aus der Datei liest.
Dazu können wir uns die offizielle Oracle-Dokumentation ansehen:
Wenn Sie bemerkt haben, dass wir ein anderes Schlüsselwort verwendet haben, das vorübergehend ist .
Wenn ein Feld nicht serialisierbar ist, muss es als vorübergehend markiert werden. Hier haben wir den itemCostPrice markiert als vorübergehend und möchten nicht, dass er in eine Datei geschrieben wird
Schauen wir uns nun an, wie Sie den Status eines Objekts in die Datei schreiben und von dort aus lesen.
Oben sehen wir ein Beispiel für die Serialisierung und Deserialisierung eines Objekts.
Dafür haben wir zwei Klassen verwendet. Für die Serialisierung des Objekts haben wir ObjectOutputStream verwendet. Wir haben die Methode writeObject verwendet, um das Objekt in die Datei zu schreiben.
Für die Deserialisierung haben wir ObjectInputStream verwendet, der aus dem Objekt aus der Datei liest. Es verwendet readObject, um die Objektdaten aus der Datei zu lesen.
Die Ausgabe des obigen Codes wäre wie folgt:
Beachten Sie, dass itemCostPrice vom deserialisierten Objekt null ist da es nicht geschrieben wurde.
Wir haben bereits in Teil I dieses Artikels die Grundlagen der Java-Serialisierung erörtert.
Lassen Sie uns nun ausführlich darüber diskutieren und wie es funktioniert.
Beginnen wir zunächst mit der Serienversion.
Die serialVersionUID wird als Versionskontrolle in einer serialisierbaren Klasse verwendet.
Wenn Sie eine serialVersionUID nicht explizit deklarieren, erledigt JVM dies automatisch für Sie, basierend auf verschiedenen Eigenschaften der Serializable-Klasse.
Javas Algorithmus zur Berechnung der Serialversionuid (Weitere Details finden Sie hier)
Javas Serialisierungsalgorithmus
Dinge, die Sie beachten sollten:
Statische Felder in einer Klasse können nicht serialisiert werden.
Wenn sich die serialversionuid in der Leseklasse unterscheidet, wird eine
InvalidClassException
Ausnahme ausgelöst .Wenn eine Klasse serialisierbar implementiert, sind auch alle ihre Unterklassen serialisierbar.
Wenn eine Klasse eine Referenz einer anderen Klasse hat, müssen alle Referenzen serialisierbar sein, da sonst kein Serialisierungsprozess durchgeführt wird. In diesem Fall wird NotSerializableException zur Laufzeit ausgelöst.
Z.B:
quelle
serialVersionUID
anders ist, wird es ein werfenInvalidClassException
, nicht einClassCastException
. Es ist nicht notwendig, den gesamten Speicherplatz für dieserialVersionUID
Berechnung zu verschwenden . Die Dokumentation wird zu ausführlich zitiert, jedoch nicht verlinkt oder ordnungsgemäß zitiert. Zu viel Flaum hier und zu viele Fehler.Bei der Serialisierung wird der Status eines Objekts in Bits konvertiert, damit es auf einer Festplatte gespeichert werden kann. Wenn Sie dasselbe Objekt deserialisieren, behält es später seinen Status bei. Sie können Objekte neu erstellen, ohne die Eigenschaften der Objekte manuell speichern zu müssen.
http://en.wikipedia.org/wiki/Serialization
quelle
Java Object Serialization
Serialization
ist ein Mechanismus zum Transformieren eines Diagramms von Java-Objekten in ein Array von Bytes zur Speicherung (to disk file
) oder Übertragung (across a network
). Durch Deserialisierung können wir dann das Diagramm von Objekten wiederherstellen. Diagramme von Objekten werden mithilfe eines Referenzfreigabemechanismus korrekt wiederhergestellt. Überprüfen Sie jedoch vor dem Speichern, ob die serialVersionUID aus der Eingabedatei / dem Netzwerk und die .class-Datei serialVersionUID identisch sind. Wenn nicht, werfen Sie einejava.io.InvalidClassException
.serialVersionUID ist für den Serialisierungsprozess von wesentlicher Bedeutung. Für den Entwickler ist es jedoch optional, es der Java-Quelldatei hinzuzufügen. Wenn eine serialVersionUID nicht enthalten ist, generiert die Serialisierungslaufzeit eine serialVersionUID und ordnet sie der Klasse zu. Das serialisierte Objekt enthält diese serialVersionUID zusammen mit anderen Daten.
Hinweis - Es wird dringend empfohlen, dass alle serialisierbaren Klassen explizit eine serialVersionUID deklarieren. Dies
since the default serialVersionUID computation is highly sensitive to class details that may vary depending on compiler implementations
kann zu unerwarteten Konflikten zwischen serialVersionUID während der Deserialisierung führen, wodurch die Deserialisierung fehlschlägt.Überprüfen serialisierbarer Klassen
Eine Klasse muss die Schnittstelle java.io.Serializable implementieren, um ihr Objekt erfolgreich zu serialisieren. Serializable ist eine Markierungsschnittstelle, mit der der Compiler darüber informiert wird, dass der Klasse, die sie implementiert, ein serialisierbares Verhalten hinzugefügt werden muss. Hier ist Java Virtual Machine (JVM) für die automatische Serialisierung verantwortlich.
Durch die Implementierung der Externalizable-Schnittstelle kann das Objekt die vollständige Kontrolle über Inhalt und Format der serialisierten Form des Objekts übernehmen. Die Methoden der Externalizable-Schnittstelle writeExternal und readExternal werden aufgerufen, um den Objektstatus zu speichern und wiederherzustellen. Wenn sie von einer Klasse implementiert werden, können sie mit allen Methoden von ObjectOutput und ObjectInput ihren eigenen Status schreiben und lesen. Es liegt in der Verantwortung der Objekte, die auftretende Versionierung durchzuführen.
Nur Objekte, die die Schnittstelle java.io.Serializable oder java.io.Externalizable unterstützen, können
written to
/read from
Streams sein. Die Klasse jedes serialisierbaren Objekts wird codiert, einschließlich des Klassennamens und der Signatur der Klasse, der Werte der Felder und Arrays des Objekts und des Schließens aller anderen Objekte, auf die von den ursprünglichen Objekten verwiesen wird.Serialisierbares Beispiel für Dateien
Serialisierbares Beispiel über Netzwerk
Objekt verteilen auf verschiedene Adressräume, entweder in verschiedenen Prozessen auf demselben Computer oder sogar auf mehreren Computern, die über ein Netzwerk verbunden sind, aber zusammenarbeiten, indem Daten gemeinsam genutzt und Methoden aufgerufen werden.
@sehen
quelle
JVM to JVM
Bei der Serialisierung wird ein Objekt auf einem Speichermedium (z. B. einer Datei oder einem Speicherpuffer) gespeichert oder über eine Netzwerkverbindung in binärer Form übertragen. Die serialisierten Objekte sind JVM-unabhängig und können von jeder JVM erneut serialisiert werden. In diesem Fall wird der Java-Objektstatus "im Speicher" in einen Bytestream konvertiert. Dieser Dateityp kann vom Benutzer nicht verstanden werden. Es handelt sich um einen speziellen Objekttyp, der von der JVM (Java Virtual Machine) wiederverwendet wird. Dieser Prozess des Serialisierens eines Objekts wird auch als Entleeren oder Marshalling eines Objekts bezeichnet.
Das zu serialisierende Objekt muss die
java.io.Serializable
Schnittstelle implementieren . Der Standard-Serialisierungsmechanismus für ein Objekt schreibt die Klasse des Objekts, die Klassensignatur und die Werte aller nicht transienten und nicht statischen Felder.ObjectOutput
interface erweitert dieDataOutput
Schnittstelle und fügt Methoden zum Serialisieren von Objekten und Schreiben von Bytes in die Datei hinzu. DieObjectOutputStream
erweitertjava.io.OutputStream
und implementiert dieObjectOutput
Schnittstelle. Es serialisiert Objekte, Arrays und andere Werte in einen Stream. Der Konstruktor vonObjectOutputStream
lautet also wie folgt:Der obige Code wurde verwendet, um die Instanz der
ObjectOutput
Klasse mit demObjectOutputStream( )
Konstruktor zu erstellen, der die Instanz vonFileOuputStream
als Parameter verwendet.Die
ObjectOutput
Schnittstelle wird durch Implementieren derObjectOutputStream
Klasse verwendet. DasObjectOutputStream
ist so konstruiert, dass es das Objekt serialisiert.Deserialisieren eines Objekts in Java
Die entgegengesetzte Operation der Serialisierung wird als Deserialisierung bezeichnet, dh das Extrahieren der Daten aus einer Reihe von Bytes wird als Deserialisierung bezeichnet, die auch als Aufblasen oder Entmarshalling bezeichnet wird.
ObjectInputStream
erweitertjava.io.InputStream
und implementiert dieObjectInput
Schnittstelle. Es deserialisiert Objekte, Arrays und andere Werte aus einem Eingabestream. Der Konstruktor vonObjectInputStream
lautet also wie folgt:Der obige Code des Programms erstellt die Instanz der
ObjectInputStream
Klasse, um die von derObjectInputStream
Klasse serialisierte Datei zu deserialisieren . Der obige Code erstellt die Instanz unter Verwendung der Instanz derFileInputStream
Klasse, die das angegebene Dateiobjekt enthält, das deserialisiert werden muss, da derObjectInputStream()
Konstruktor den Eingabestream benötigt.quelle
Bei der Serialisierung wird ein Java-Objekt in ein Byte-Array und dann wieder in ein Objekt mit seinem beibehaltenen Status umgewandelt. Nützlich für verschiedene Dinge wie das Senden von Objekten über das Netzwerk oder das Zwischenspeichern von Dingen auf die Festplatte.
Lesen Sie mehr aus diesem kurzen Artikel, in dem die Programmierung eines Teils des Prozesses recht gut erklärt wird, und wechseln Sie dann zu Serializable javadoc . Möglicherweise möchten Sie auch diese verwandte Frage lesen .
quelle
Geben Sie die Datei als Objekt zurück: http://www.tutorialspoint.com/java/java_serialization.htm
quelle
| * | Serialisieren einer Klasse: Konvertieren eines Objekts in Bytes und Bytes zurück in ein Objekt (Deserialisierung).
| => Objekt-Serialisierung ist ein Prozess zum Konvertieren des Status eines Objekts in Dampf von Bytes.
| => Objekt-Deserialisierung ist der Prozess, bei dem der Status eines Objekts abgerufen und in einem Objekt (java.lang.Object) gespeichert wird.
& nbsp & nbspWenn nicht java.io.InvalidClassException ausgelöst wird.
| => Ein Java-Objekt ist nur dann serialisierbar, wenn seine Klasse oder eine seiner Oberklassen
| => Statische Felder in einer Klasse können nicht serialisiert werden.
| => Wenn Sie eine Variable einer Klasse nicht serialisieren möchten, verwenden Sie das Schlüsselwort transient
| => Wenn eine Klasse serialisierbar implementiert, sind auch alle ihre Unterklassen serialisierbar.
| => Wenn eine Klasse eine Referenz einer anderen Klasse hat, müssen alle Referenzen serialisierbar sein, da sonst kein Serialisierungsprozess durchgeführt wird. In diesem Fall wird
NotSerializableException zur Laufzeit ausgelöst.
quelle
Ich werde eine Analogie anbieten, die möglicherweise dazu beiträgt, den konzeptionellen Zweck / die Praktikabilität der Objektserialisierung / -deserialisierung zu festigen .
Ich stelle mir die Serialisierung / Deserialisierung von Objekten im Zusammenhang mit dem Versuch vor, ein Objekt durch einen Sturmabfluss zu bewegen. Das Objekt wird im Wesentlichen "zerlegt" oder in modularere Versionen von sich selbst - in diesem Fall eine Reihe von Bytes - serialisiert , um effektiv den Durchgang durch ein Medium zu erhalten. In rechnerischer Hinsicht könnten wir den Pfad, den die Bytes durch den Sturmabfluss zurücklegen, als ähnlich wie Bytes betrachten, die sich durch ein Netzwerk bewegen. Wir wandeln unser Objekt um, um es einem wünschenswerteren Transportmittel oder Format anzupassen. Das serialisierte Objekt wird normalerweise in einer Binärdatei gespeichert, aus der später gelesen, geschrieben oder beides geschrieben werden kann.
Sobald unser Objekt in der Lage ist, als zerlegte Folge von Bytes durch den Drain zu rutschen, möchten wir diese Darstellung des Objekts möglicherweise als Binärdaten in einer Datenbank oder einem Festplattenlaufwerk speichern. Der wichtigste Aspekt ist jedoch, dass wir bei der Serialisierung / Deserialisierung die Option haben, unser Objekt nach der Serialisierung in seiner binären Form zu belassen oder die ursprüngliche Form des Objekts durch Deserialisierung "abzurufen".
quelle