Wie kann man Daten serialisieren?

Unter dem Begriff 'serialisieren' versteht man das Speichern von Objektstrukturen und Variablenbelegungen über die Laufzeit der Applikation hinaus. Sie können hierdurch z.B. auch in Netzwerken verfügbar gemacht werden. Mit Hilfe eines ObjectInputStream und ObjectOutputStream können diese persistent gemacht, d.h. in einer Datei gespeichert werden.

Das Problem besteht darin, dass z.B. Objekte wiederum Objekte enthalten können, die mitgesichert werden müssen. Dies erfolgt bei der Serialisierung in Byteform in einer Datei, die üblicherweise die Dateiendung *.ser besitzt.

import java.io.*;
import java.util.ArrayList;

public class ObjectSchreibenClass {
    
    public static void main(String[] args) {
        String datnam = "/Users/joecze/Downloads/myObjs.ser";
        ArrayList<Object> objArrList = read(datnam);
        write(objArrList, datnam);
    }
    
    @SuppressWarnings("unchecked")
    public static ArrayList<Object> read(String datnam) {
        ArrayList<Object> objArrList = null;
        try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(datnam))) {
            objArrList = (ArrayList<Object>) in.readObject();
        } catch (FileNotFoundException ex) {
            System.out.println("Speicherdatei (noch) nicht vorhanden!");
        } catch (Exception ex) {
            System.out.println(ex);
        }
        return objArrList;
    }
    
    public static void write(ArrayList<Object> objArrList, String datnam) {
        if (objArrList == null)
            objArrList = new ArrayList<Object>();

        objArrList.add(new String("ArrayListgroesse: " + objArrList.size()));
        System.out.println(objArrList);

        try (ObjectOutputStream aus = new ObjectOutputStream(new FileOutputStream(datnam))) {
            aus.writeObject(objArrList);
        } catch (IOException ex) {
            System.out.println(ex);
        }
    }
}

Im Zentrum der Serialisierung steht die Klasse ObjectOutputStream mit ihrer Methode writeObject(), die rekursiv die vorhandenen Objektzustände durchläuft und sie an einen FileOutputStream weiterleitet.

Im Beispiel wird zunächst in der Methode read() eine ArrayList erzeugt und mit null initialisiert. Sie wird aus der angegebenen am angegebenen Pfad abgelegten Datei ausgelesen und zurückgegeben. Da der ausgelesene Typ nicht überprüft werden kann, jedoch zu ArrayList gecastet wird, wird der Methode die Annotation "unchecked" vorangestellt. War die Datei nicht vorhanden oder leer, so ist das ArrayList-Objekt an dieser Stelle noch null.
Der Methode write() werden dann die ArrayList und der Pfadstring übergeben. Bei Nichtexistenz der ArrayList wird diese neu instanziert. Ihr wird zu den dort evtl. gespeicherten Objekten ein String und die Größenangabe der vorhandenen Liste hinzugefügt. Durch die o.a. Mechanismen wird sie dann am angegebenen Pfad abgespeichert.

Ein Beispiel für die Serialisierung eines eigenen Referenztyps findet sich unter Modifikatoren - transient