Die Serialisierung ist ein wichtiger Mechanismus, mithilfe dessen Objekte, die bekanntlich zur Laufzeit existieren, in einen Datenstrom von Bytes übersetzt werden. Mithilfe dieses Streams lassen sich Objekte mitsamt der Fülle ihrer Eigenschaften unabhängig von der Laufzeit des Programmes rekonstruieren. Anwendung findet sie daher grundlegend in der Persistierung oder bei der Netzwerkübertragung bei verteilten Systemen. Die Standard-Serialisierung in Java, die schon seit den Anfängen dieser Softwaresprache eingeführt wurde, bietet sehr viel Flexibilität in der Anpassung des Serialisierungsprozesses, steht heute aber vor allem aus sicherheitsbedenklichen Gegebenheiten massiv unter Kritik.
Inhaltsverzeichnis
1 EINFÜHRUNG
2 SERIALISIERUNG
2.1 Allgemeines zum Serialisieren
2.2 Umsetzung in Java
3 EINFÜHRUNG IN DAS JAVA-FRAMEWORK AN EIGENEM BEISPIEL
3.1 Standard-Serialisierung in Java
3.1.1 Welche Objekte lassen sich serialisieren?
3.1.2 Wie serialisiert man Objekte in Java?
3.1.3 Beim Serialisieren mitbestimmen.
3.1.4 Der Serialisierung vorschreiben, was serialisiert wird und was nicht.
3.1.5 Die SUID.
3.2 Implementierungsbeispiel
3.3 Einblick in die XML-Serialisierung in Java
3.3.1 Serialisieren mit JavaBeans Persistence.
3.3.2 Serialisieren mit XStream.
4 BEWERTUNG DER STANDARD-SERIALISIERUNG
4.1 Problem- und Effizienzbetrachtung
4.2 Sicherheitsaspekte
Zielsetzung & Themen
Die Arbeit untersucht das Konzept der Serialisierung in Java, mit dem Ziel, die Funktionsweise, Implementierungsmöglichkeiten und Sicherheitsaspekte dieses Mechanismus detailliert darzulegen und kritisch zu bewerten.
- Grundlagen und Definition der Serialisierung von Daten
- Implementierung der Standard-Serialisierung in Java
- Vergleichende Analyse von XML-basierten Serialisierungsformaten
- Sicherheitsbedenken und Schwachstellen bei Deserialisierungsprozessen
- Effizienzbetrachtung und Optimierungsansätze für den serialisierten Datenstrom
Auszug aus dem Buch
3.1.2 Wie serialisiert man Objekte in Java?
Beim Serialisieren wird auf seriellen Datenströmen gearbeitet, deshalb stellt Java zwei spezielle Methoden bereit, die beide Output- bzw. Inputstream erweitern.
Zur Serialisierung steht die Klasse ObjectOutputStream zur Verfügung, die durch writeObject() die Objekte als einzelne Eingabeparameter serialisiert in den Bytestrom des im Konstruktor mitgegebenen OutputStreams, z.B. einem FileOutputStream schreibt. Wird ein Blick in die Methodenliste der API geworfen, so fallen andere datentypspezifische write- Methoden gibt. Der Grund dafür ist, dass die Klasse ObjectOutputStream die Schnittstelle DataOutput implementiert und diese extra für primitive Datentypen und Strings Methoden zum Serialisieren anbietet.
Das Deserialisieren funktioniert im Prinzip gleich wie oben beschrieben. Das Gegenstück enthält ObjectInputStream und readObject() und liest den seriellen Strom aus, damit die Objekte geklont werden können. Diese werden von der parameterlosen read-Methode erzeugt und ausgegeben. Mehrere read-Methoden gibt es auch hier, weil ObjectInputStream DataInput implementiert.
Dies sind die wichtigsten Komponenten um einen Serialisierungsprozess in Java zu implementieren. Dabei darf natürlich nicht vergessen werden, die entsprechenden Klassen das Interface ‹Serializable› implementieren zu lassen. Auf eine sorgfältige Ausnahmenbehandlung muss natürlich auch geachtet werden. Darunter fallen Fehlermeldungen an wie IOException, NotSerializableException, welcher geworfen wird, wenn die nicht-serialisierbare Objekte serialisiert werden sollen. Ein weiterer Exception ist der , der geworfen wird, falls beim Deserialisieren die Klasse nach dem Serialisieren geändert wurde.
Die Methode void useProtocolVersion(int version) gibt dem Anwender interessanterweise die Möglichkeit zwischen zwei Protokollarten zu entscheiden, nämlich: static final int PROTOCOL _ VERSION _ 1 und static final int PROTOCOL _ VERSION _ 2. Letzter verwendet einen Blockmodus für die Objekte und wurde seit Java 1.2 eingeführt.
Zusammenfassung der Kapitel
1 EINFÜHRUNG: Diese Einleitung motiviert das Konzept der Serialisierung als Mittel zur belegungs- und strukturerhaltenden Persistierung von Objekten über die Laufzeit eines Programms hinweg.
2 SERIALISIERUNG: Das Kapitel definiert Serialisierung als Abbildung strukturierter Daten in einen Bytestrom und erörtert grundlegende Einsatzgebiete sowie die verschiedenen Verfahren in Java.
3 EINFÜHRUNG IN DAS JAVA-FRAMEWORK AN EIGENEM BEISPIEL: Hier wird detailliert auf die Standard-Serialisierung, die Implementierung via Serializable/Externalizable, Sicherheitsaspekte der SUID sowie alternative XML-Frameworks eingegangen.
4 BEWERTUNG DER STANDARD-SERIALISIERUNG: Dieses Kapitel liefert eine kritische Betrachtung der Standard-Serialisierung hinsichtlich ihrer Effizienz, Performance und der daraus resultierenden Sicherheitsrisiken.
Schlüsselwörter
Serialisierung, Deserialisierung, Java, ObjectOutputStream, ObjectInputStream, Serializable, XML-Serialisierung, JavaBeans Persistence, XStream, Datensicherheit, SUID, Bytestrom, Persistierung, Java Remote Method Invocation, Input-Validierung
Häufig gestellte Fragen
Worum geht es in dieser Arbeit grundsätzlich?
Die Arbeit behandelt den Mechanismus der Serialisierung unter Java, bei dem Objekte in einen Datenstrom umgewandelt werden, um sie zu speichern oder in Netzwerken zu übertragen.
Was sind die zentralen Themenfelder?
Zentrale Themen sind die Standard-Serialisierung von Java, XML-basierte Ansätze, die individuelle Anpassung des Serialisierungsvorgangs sowie die kritischen Sicherheitsaspekte bei der Deserialisierung.
Was ist das primäre Ziel der Arbeit?
Ziel ist es, ein tiefgehendes Verständnis für die Funktionsweise der Java-Serialisierung zu vermitteln und dem Programmierer Werkzeuge an die Hand zu geben, um diesen Prozess sicher und effizient zu gestalten.
Welche wissenschaftliche Methode wird verwendet?
Die Arbeit nutzt eine Literaturanalyse sowie die praktische Implementierung eines Beispiels, um die theoretischen Aspekte des Java-Frameworks zu verifizieren und zu vertiefen.
Was wird im Hauptteil behandelt?
Im Hauptteil werden neben den grundlegenden Klassen der Standard-Serialisierung, die Möglichkeiten zur Beeinflussung des Prozesses (z.B. mittels readObject/writeObject) und spezielle Frameworks wie JavaBeans Persistence und XStream erläutert.
Welche Schlüsselwörter charakterisieren die Arbeit?
Wesentliche Begriffe sind Serialisierung, Deserialisierung, Java, Serializable-Schnittstelle, XML-Format, SUID und die Sicherheit im Kontext von seriellen Datenströmen.
Warum wird im Buch zwischen textorientierter und byte-orientierter Serialisierung unterschieden?
Die Unterscheidung basiert auf der Anforderungen an Lesbarkeit für den Menschen (textorientiert, z.B. XML) versus Effizienz und Speicherplatzbedarf (byte-orientiert).
Welche Rolle spielt die SUID bei der Serialisierung?
Die SerialVersionUID (SUID) dient als Identifikator für die Klassenversion, um zu verhindern, dass bei inkompatiblen Code-Änderungen während der Deserialisierung Laufzeitfehler auftreten.
Warum wird die Standard-Serialisierung in Java kritisch betrachtet?
Sie wird unter anderem wegen ihrer Defizite bei der Effizienz, der mangelnden Plattformunabhängigkeit sowie wegen erheblicher Sicherheitsrisiken bei der Deserialisierung von Objekten kritisiert.
- Quote paper
- Salih Sakar (Author), 2019, Serialization in Java, Munich, GRIN Verlag, https://www.grin.com/document/1422955