Ich möchte verschiedene Objekttypen in XML-Dateien ablegen und später wieder einlesen.
Dazu habe ich mir eine Klasse zum Serialisieren mit XML von JavaBeans geschrieben, die ich euch erstmal zeige:
import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
class XMLStructureIO<T> {
private final String filename;
XMLStructureIO(String filename) {
this.filename = filename;
}
void write(T obj) throws FileNotFoundException {
XMLEncoder enc = new XMLEncoder(new BufferedOutputStream(
new FileOutputStream(filename)));
enc.writeObject(obj);
enc.close();
}
T read() throws FileNotFoundException {
XMLDecoder dec = new XMLDecoder(new BufferedInputStream(
new FileInputStream(filename)));
T obj = (T) dec.readObject();
dec.close();
return obj;
}
}
Die Klasse funktioniert soweit. Das Problem hier ist aber, dass ich eine Warnung beim Kompilieren erhalte:
warning: [unchecked] unchecked cast
T obj = (T) dec.readObject();
required: T
found: Object
where T is a type-variable:
T extends Object declared in class XMLStructureIO
Jetzt wüsste ich gerne, wie man dieses Problem behebt. Danke für eure Zeit und Mühe
Ja, da gibt es so direkt tatsächlich nichts. In manchen Fällen kann man an so einer Stelle (wie hier der read-Methode) dann ein Class<T> expectedType übergeben um mit Class#isInstance oder Class#cast rumzuhantieren, aber das wäre hier vermutlich kaum sinnvoll möglich.
Außer JaxB fällt mir da auch nix zu ein. Wobei man dazu sagen muss, dass dort die unchecked cass auch nur durch dynamisch erzeugten Code/Casts kaschiert werden.
Wenn dich die Warnung “nervt” kannst du die Methode noch mit @SuppressWarnings(“unchecked”) annotieren. Sprich wenn du weißt, dass dieser Stelle nichts schief geht (und das ist in deinem Fall so), kannst du damit die Warning unterdrücken.
Das könnte ich machen, ja. Ich habe aber nach einer Lösung gesucht, das generische Objekt des übergebenen Typs zurück zu bekommen. Dass das in dem Fall offenbar nicht sauber mit “pure Generics” machbar scheint, war mit bis dahin nicht klar.