Wie Ihr Euch bestimmt schon denken könnt, gibt es eine Lösung für das Problem der NullPointerExceptions bei transienten Variablen/ Objekten. Es werden die Methoden readObject/ writeObjekt so überschrieben, dass zwar nicht das Objekt mitserialisiert wird, aber die Werte die zur Anlage eines neuen Objektes benötigt werden:
Der Einfachheit halber habe ich unser Beispiel ein bisschen angepasst, so dass zur Anlage von Auto kein Objekt (String), sondern ein primitiver Datentyp benötigt wird. Ich beziehe mich im folgenden nur auf Änderungen, bezüglich (De-)Serialisierung.
import java.io.*; // Definitionen wie gehabt, keine Veränderung.
class Angestellter implements Serializable {
public static void main(String args[]) {
Auto auto = new Auto (345);
Manager manager = new Manager(“Finanzen”, auto);
try {
FileOutputStream fos = new FileOutputStream(“Manager.ser”);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(manager);
oos.flush();
oos.close();
}catch (IOException e){ e.printStackTrace(); }
try {
FileInputStream fis = new FileInputStream(“Manager.ser”);
ObjectInputStream ois = new ObjectInputStream(fis);
manager=(Manager) ois.readObject();
}catch (IOException e) { e.printStackTrace();}
catch (ClassNotFoundException e){e.printStackTrace();}
}
}
class Manager implements Serializable {
private void writeObject(ObjectOutputStream oos){ // Überschreibung der Methode writeObjekt, um die NullPointerException zu umgehen
try{
oos.defaultWriteObject(); // Wegschreiben des Objektes
oos.writeInt(auto.FahrzeugNr); // Zusätzliches Wegschreiben des int-Wertes, mit dem Auto angelegt wird
} catch (IOException e) { e.printStackTrace(); }
}
private void readObject (ObjectInputStream ois){c
try {
ois.defaultReadObject(); // Lesen des Objektes
auto = new Auto(ois.readInt()); //Lesen des weggeschriebenen int-Wert und gleichzeitige Anlage des Objektes Auto
} catch (IOException e){e.printStackTrace(); }
catch (ClassNotFoundException e){e.printStackTrace();}
}
String Bereich;
transient Auto auto;
Manager (String Bereich, Auto auto){
this.Bereich=Bereich;
this.auto=auto;
}
void getAuto() {System.out.println(auto.FahrzeugNr); }
}
class Auto implements Serializable { // Auch hier keine Veränderung des Codes bezüglich Serialisierung
int FahrzeugNr;
Auto (int FahrzeugNr){
this.FahrzeugNr=FahrzeugNr;
}
}