Analyse des Java-Serialisierungsalgorithmus
Bei der Serialisierung handelt es sich um einen Prozess, bei dem ein Objekt als eine Reihe von Bytes beschrieben wird. Bei der Deserialisierung handelt es sich um einen Prozess, bei dem diese Bytes in ein Objekt rekonstruiert werden. Die Java Serialization API bietet einen Standardmechanismus für die Handhabung der Objektserialisierung. Hier erfahren Sie, wie Sie ein Objekt serialisieren, wenn eine Serialisierung erforderlich ist, und den Java-Serialisierungsalgorithmus. Anhand eines Beispiels demonstrieren wir, wie die Bytes nach der Serialisierung die Informationen eines Objekts beschreiben.
Die Notwendigkeit der Serialisierung
In Java ist alles ein Objekt. In einer verteilten Umgebung ist es oft notwendig, Objekte von einem Netzwerk oder Gerät auf das andere zu übertragen. Hierzu ist ein Protokoll erforderlich, das beidseitig Daten übertragen kann. Zur Lösung dieses Problems wurde der Java-Serialisierungsmechanismus entwickelt.
So serialisieren Sie ein Objekt
Voraussetzung dafür, dass ein Objekt serialisierbar ist, ist die Implementierung der Serializable-Schnittstelle. Die Serializable-Schnittstelle verfügt über keine Methoden und ähnelt eher einem Marker. Klassen mit diesem Tag können vom Serialisierungsmechanismus verarbeitet werden.
100.
Das Serialisierungsformat des Objekts
Wie sieht ein Objekt nach der Serialisierung aus? Öffnen Sie die temp.out-Datei, die wir gerade serialisiert und das Objekt ausgegeben haben, und zeigen Sie sie hexadezimal an. Der Inhalt sollte wie folgt sein:
73 74 A0 0C 34 00 FE B1 DD F9 02 00 02 42 00 05
63 6F 75 6E 74 42 00 07 76 65 72 73 69 6F 6E 78
70 00 64
öffentliche Byteversion = 100;
öffentliche Byteanzahl = 0;
Beide sind vom Typ Byte. Theoretisch sind zum Speichern dieser beiden Felder nur 2 Byte erforderlich. Tatsächlich belegt temp.out jedoch 51 Byte, was bedeutet, dass es neben Daten auch andere Beschreibungen des serialisierten Objekts enthält.
Java-Serialisierungsalgorithmus
Der Serialisierungsalgorithmus führt im Allgemeinen die folgenden Schritte aus:
◆Klassenmetadaten im Zusammenhang mit Objektinstanzen ausgeben.
◆Rekursive Ausgabe der Superklassenbeschreibung der Klasse, bis keine Superklassen mehr vorhanden sind.
◆Nach Abschluss der Klassenmetadaten werden die tatsächlichen Datenwerte der Objektinstanz ausgehend von der Oberklasse der obersten Ebene ausgegeben.
◆Instanzdaten rekursiv von oben nach unten ausgeben
Lassen Sie uns dies anhand eines weiteren Beispiels veranschaulichen, das alle möglichen Situationen umfassender abdeckt:
Klasse enthält implementiert Serializable{
int includeVersion = 11;
}
Die öffentliche Klasse SerialTest erweitert die übergeordneten Implementierungen Serializable {
int-Version = 66;
enthalten con = new enthalten();
public int getVersion() {
Rückgabeversion;
}
public static void main(String args[]) löst eine IOException {
FileOutputStream fos = new FileOutputStream("temp.out");
ObjectOutputStream oos = new ObjectOutputStream(fos);
SerialTest st = new SerialTest();
oos.writeObject(st);
oos.flush();
oos.close();
}
}
Das serialisierte Format ist wie folgt:
AC ED 00 05 7372 00 0A 53 65 72 69 61 6C 54 65
73 74 05 52 81 5A AC 66 02 F6 02 00 0249 00 07
76 65 72 73 69 6F 6E4C00 03 63 6F 6E74 00 09
4C63 6F 6E 74 61 69 6E 3B 7872 00 06 70 61 72
65 6E 74 0E DB D2 BD 85 EE 63 7A 02 00 0149 00
0D 70 61 72 65 6E 74 56 65 72 73 69 6F 6E 78 70
0000000A 0000004273 72 00 07 63 6F 6E 74
61 69 6E FC BB E6 0E FB CB 60 C7 02 00 0149 00
0E 63 6F 6E 74 61 69 6E 56 65 72 73 69 6F 6E 78
700000000B
Schauen wir uns genauer an, was diese Bytes darstellen. Anfang, siehe Farbe:
Der erste Schritt im Serialisierungsalgorithmus besteht darin, eine Beschreibung der zugehörigen Klasse des Objekts auszugeben. Das im Beispiel gezeigte Objekt ist eine Instanz der SerialTest-Klasse, daher wird als Nächstes die Beschreibung der SerialTest-Klasse ausgegeben. Siehe Farben:
Als nächstes gibt der Algorithmus eines der Felder aus, inversion=66; siehe Farbe:
Dann gibt der Algorithmus die nächste Domäne aus, CONTAIN CON = NEW CONTAIN(); Das ist etwas Besonderes, es ist ein Objekt. Bei der Beschreibung von Objekttypreferenzen müssen Sie die Standard-Objektsignaturnotation der JVM verwenden, siehe Farbe:
.Dann gibt der Algorithmus die Beschreibung der Superklasse aus, die die übergeordnete Klasse ist. Siehe die Farbe:
Geben Sie als Nächstes die Domänenbeschreibung der übergeordneten Klasse aus, intparentVersion=100; siehe auch color:
Bisher hat der Algorithmus die Beschreibungen aller Klassen ausgegeben. Der nächste Schritt besteht darin, den tatsächlichen Wert des Instanzobjekts auszugeben. Zu diesem Zeitpunkt beginnt es in der Domäne der übergeordneten Klasse, siehe Farbe:
Es gibt auch Felder der SerialTest-Klasse:
Die folgenden Bytes sind interessanter. Der Algorithmus muss die Informationen der enthaltenen Klasse beschreiben. Siehe die Farbe.
.Geben Sie die eindeutige Domänenbeschreibung von include aus, intcontainVersion=11;
Zu diesem Zeitpunkt prüft der Serialisierungsalgorithmus, ob „Contain“ über eine Oberklasse verfügt, und gibt diese in diesem Fall aus.
Abschließend wird der tatsächliche Domänenwert der enthaltenen Klasse ausgegeben.
OK, wir haben den Mechanismus und die Prinzipien der Java-Serialisierung besprochen und hoffen, dass es für die Schüler hilfreich sein wird.