In Java ist alles ein Objekt, und in einer verteilten Umgebung ist es häufig erforderlich, ein Objekt von einem Ende des Netzwerks oder Geräts an das andere Ende zu übergeben. Dies erfordert ein Protokoll, das Daten an beiden Enden übertragen kann. Der Java -Serialisierungsmechanismus wird erstellt, um dieses Problem zu lösen.
Nachdem Sie den Objektstatus in einen Byte -Stream konvertiert haben, können Sie ihn mit Klassen verschiedener Byte -Streams im Java.io -Paket in eine Datei speichern, in einen anderen Thread oder über eine Netzwerkverbindung an einen anderen Host senden. Die Objekt -Serialisierungsfunktion ist sehr einfach und leistungsstark und wird in RMI, Socket, JMS und EJB verwendet. Das Objekt -Serialisierungsproblem ist nicht das zentralste Problem bei der Netzwerkprogrammierung, aber es ist sehr wichtig und hat viele praktische Bedeutung.
Die Serialisierung der Java -Objekte behält nicht nur die Daten eines Objekts bei, sondern speichert auch rekursiv die Daten jedes vom Objekt verwiesenen Objekt. Die gesamte Objekthierarchie kann in einen Byte -Stream geschrieben, in einer Datei gespeichert oder eine Netzwerkverbindung übergeben werden. Die Objektserialisierung kann verwendet werden, um das "tiefe Kopieren" des Objekts durchzuführen, das heißt und das Objekt selbst und das referenzierte Objekt selbst kopieren. Das Serialisieren eines Objekts kann zu einer Sequenz des gesamten Objekts führen.
Grundnutzungsmethode:
Die Serialisierung bezieht sich darauf, eine Klasse oder einen grundlegenden Datentyp in einen Datenstrom, einschließlich Datei-, Byte -Stream- und Netzwerkdatenstrom, zu bestehen.
Die Implementierung der Serialisierung in Java beruht hauptsächlich auf zwei Klassen: ObjectOututStream und ObjectInputStream. Sie sind Unterklassen von OutputStream und InputStream im Java -IO -System. Da es sich um Ströme in Java IO handelt, können sie sie wie Streams bedienen. So werden sie verwendet:
importieren java.io.BytearrayInputStream; importieren java.io.BytearrayoutputStream; importieren java.io.ioException; importieren java.io.objectinputStream; importieren java.io.objectoutputStream; importieren java.io.serializable; Public Class Pair implementiert serialisierbar {private statische endgültige lange Serialversionuid = -1874850715617681161L; privater Int -Typ; privater Zeichenfolge Name; public int gettType () {return type; } public void setType (int type) {this.type = type; } public String getName () {return name; } public void setName (String -Name) {this.name = name; } public pair (int type, string name) {super (); this.type = Typ; this.name = name; } public static void main (String [] args) löst IOException, classNotFoundException aus {// Todo auto-generierter Methode Stub // Serialisierung des Objektpaares BytearrayoutputStream Bos = new bytearrayoutputStream (); ObjectOutputStream OOS = New ObjectOutputStream (BOS); Paarpaar = neues Paar (1, "Charlie"); OOS.WriteObject (Paar); // Deserialize Object, erhalten Sie ein neues Objekt Newpair BytearrayInputStream Bis = New BytearrayInputStream (bos.tobytearray ()); ObjectInputStream OIS = New ObjectInputStream (BIS); Pair newpair = (pair) ois.readObject (); System.out.println (newpair.gettype ()+":"+newpair.getName ()); }}1. Beide Klassen befinden sich im Dekorationsmuster. Beim Erstellen müssen sie in einem Byte-basierten Stream passieren. Diese Streams sind diejenigen, die unten wirklich serialisierte Daten speichern.
2. Die persistierte Klasse muss die serialisierbare Schnittstelle implementieren. Diese Schnittstelle hat keine Funktionen, ist aber nur eine Markierungsschnittstelle. Wenn die Serialisierung auf einer Maschine durchgeführt wird und die resultierenden Daten zur Deserialisierung auf eine andere Maschine übertragen werden, sollten die Klassen auf diesen beiden Maschinen genau gleich sein, andernfalls ist die Serialisierung nicht erfolgreich.
3. Denken Sie daran, den ToString nicht zu verwenden, um die Zeichenfolge im obigen Code zu erhalten, dann den BytearrayInputStream von dieser Zeichenfolge abzurufen und ihn dann zu demerialisieren. BOS wird in Bytes gespeichert. Das Konvertieren in die in Zeichen gespeicherten Zeichenfolge führt zwangsläufig zu Datenänderungen, und das aus der Zeichenfolge gezogene Byte [] ist nicht das vorherige Byte []. Ich bin auf dieses Problem gestoßen, weil ich die serialisierten Daten in der XML -Datei speichern möchte. Siehe einen weiteren Artikel in meiner spezifischen Lösung für dieses Problem:
www.vevb.com/article/88130.htm
Was macht die virtuelle Java -Maschine beim Serialisieren und Deserialisieren?
Der Java -Serialisierungsmechanismus in der Beschreibung dieser beiden Klassen wird in Javadoc ausführlich beschrieben:
Zitat
Der Standard-Serialisierungsmechanismus für ein Objekt schreibt die Klasse des Objekts, die Klassensignatur und die Werte aller nicht-transienten und nicht statischen Felder. Verweise auf andere Objekte (außer in transienten oder statischen Feldern) führen auch dazu, dass diese Objekte auch geschrieben werden. Mehrere Verweise auf ein einzelnes Objekt werden unter Verwendung eines Referenzfreigabemechanismus codiert, sodass Diagramme von Objekten in der gleichen Form wie beim geschriebenen Original wiederhergestellt werden können.
Der Standard -Serialisierungsmechanismus schreibt Daten in den Stream, einschließlich:
1. Die Klasse, zu der das Objekt gehört
2. Klassensignatur
3.. Alle nicht-transienten und nicht statischen Eigenschaften
4. Verweise auf andere Objekte verursachen auch eine Serialisierung dieser Objekte.
5. Wenn mehrere Referenzen auf ein Objekt hinweisen, wird der Freigaber als Referenzmechanismus verwendet.
Zitat
Klassen, die eine spezielle Handhabung während des Serialisierungs- und Deserialisierungsprozesses erfordern, müssen spezielle Methoden mit diesen genauen Signaturen implementieren:
private void readObject (java.io.objectinputStream Stream) löst IOException, classNotFoundException aus; private void writeObject (java.io.objectoutputStream) löscht IOException private void readObjectnodata () ObjectStreamException aus;