Was bedeutet der Modifikator transient
?
Das Beispiel demonstriert dies an einer Klasse mit zwei Date
-Feldern,
von denen eines als transient
deklariert wurde. Nach
Ausführen des Programms wird letzteres bei der Serialisierung
nicht berücksichtigt, sodass bei der Deserialisierung null
ausgegeben wird. Das zweite gibt den zur Laufzeit aktuellen
Zeitpunkt aus.
Einige weitere Aspekte demonstriert das Beispiel:
- Soll eine Klasse serialisiert werden, so muss sie das Interface
Serializable
implementieren. - Es sollte ein Feld
private static final long serialVersionUID
deklariert und initialisiert werden. Der Compiler ermittelt, ob diese ID gesetzt wurde. Wenn keine gefunden wird, generiert der Compiler sie. Deren Wert ist abhängig von den non-transient Feldern der Klasse. Bei der Deserialisierung muss die ID dann mit derjenigen der serialisierenden Klasse identisch sein. So wird gewährleistet, dass keine falschen oder unvollständig erhaltenen Objekte deserialisiert werden.
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Date;
public class TransientClass implements Serializable {
private static String datnam = "myObjs.ser";
private transient Date transDate = new Date();
private Date date = new Date();
private static final long serialVersionUID = -1676776445270664023L;
public static void main(String[] args) {
if (new File(datnam).exists()) {
try (ObjectInputStream in = new ObjectInputStream(
new FileInputStream(datnam))) {
TransientClass tc = (TransientClass) in.readObject();
System.out.println("deserialized date: " + tc.date);
System.out.println("deserialized transDate: " + tc.transDate); // null
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
} else {
System.out.println("'" + datnam + "' created");
}
try (ObjectOutputStream aus = new ObjectOutputStream(
new FileOutputStream(datnam))) {
aus.writeObject(new TransientClass());
System.out.println("class serialized to '" + datnam + "'.");
} catch (IOException ex) {
System.out.println("couldn't write to file '" + datnam + "'.");
}
}
}
Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.