Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ObjectInputStream - Arrayliste, die unbekannte Objekte enthält
ich will mit dem ObjectInputStream eine Liste aus einer Datei lesen, weiß aber nicht welchen Typ die Objekte in der Liste haben? Wie kann ich das machen?
Und welche genau? Also wenn`s eine CastException ist, wie lautet die genaue Fehlerbeschreibung? Sicher dass das erste Objekt/das Objekt welches du liest eine ArrayList ist? Keine LinkedList oder sonst eine Liste oder sogar ein ganz anderes Objekt (also keine Liste? )
Ansonsten mal einfach
Code:
Object obj
benutzen und nicht casten und sich dann mal anschauen um was es sich dort genau handelt
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("C:\\test\\hosts.ser"));
Object obj = ois.readObject();
Exception in thread "main" java.io.EOFException
at java.ibjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2280)
at java.ibjectInputStream$BlockDataInputStream.readUTFBody(ObjectInputStream.java:3018)
at java.ibjectInputStream$BlockDataInputStream.readUTF(ObjectInputStream.java:2819)
at java.ibjectInputStream.readString(ObjectInputStream.java:1598)
at java.ibjectInputStream.readObject0(ObjectInputStream.java:1319)
at java.ibjectInputStream.readArray(ObjectInputStream.java:1666)
at java.ibjectInputStream.readObject0(ObjectInputStream.java:1322)
at java.ibjectInputStream.defaultReadFields(ObjectInputStream.java:1946)
at java.ibjectInputStream.readSerialData(ObjectInputStream.java:1870)
at java.ibjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752)
at java.ibjectInputStream.readObject0(ObjectInputStream.java:1328)
at java.ibjectInputStream.readObject(ObjectInputStream.java:350)
at java.util.ArrayList.readObject(ArrayList.java:593)
at sun.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at java.ibjectStreamClass.invokeReadObject(ObjectStreamClass.java:974)
at java.ibjectInputStream.readSerialData(ObjectInputStream.java:1848)
at java.ibjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752)
at java.ibjectInputStream.readObject0(ObjectInputStream.java:1328)
at java.ibjectInputStream.defaultReadFields(ObjectInputStream.java:1946)
at java.ibjectInputStream.readSerialData(ObjectInputStream.java:1870)
at java.ibjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752)
at java.ibjectInputStream.readObject0(ObjectInputStream.java:1328)
at java.ibjectInputStream.skipCustomData(ObjectInputStream.java:1911)
at java.ibjectInputStream.readSerialData(ObjectInputStream.java:1873)
at java.ibjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752)
at java.ibjectInputStream.readObject0(ObjectInputStream.java:1328)
at java.ibjectInputStream.readObject(ObjectInputStream.java:350)
at Testing.main(Testing.java:12)
nun, wenn diese beiden Befehle schon zur Exception führen, dann kann man wohl nichts weiter dazu sagen,
ein anderes Vorgehen gibt es nicht
edit:
immer fällt mir nochwas ein: vielleicht enthält sie Objekte unbekannter Klassen, und es wird versucht diese Klassen nachzuladen da lokal nicht vorhanden, welche im Stream dann auch nicht da sind,
aber das ist jetzt ganz wilde Spekulation, ich selber kann dazu fast nichts sagen
Super, das war die Lösung. Die Klasse war nicht sichtbar in der Methode, in der die Datei eingelesen wurde.
Nun habe ich aber das nächste Problem: Ich habe ein Objekt und muss herausfinden von welchem Typ es sich handelt. Es ist immer in einer Liste, aber ich kann nicht rausfinden, von welchem Typ die enthaltenen Objekte sind, da ich ja nicht z.b. auf den ersten Index zugreifen und getClass() aufrufen kann, da man zur Compile-Zeit ja nicht weiß, dass es eine Liste ist...
so, zur neuen Frage:
wenn du nicht weißt wie du auf die Elemente zugreifen kannst, was interessiert dich dann der Typ der Elemente?
die Frage wie man auf die Elemente zugreifen kann wäre für mich spannend genug..
wenn es eine normale Liste ist, dann kannst du auf das Interface java.util.List casten, get() und Co. sind dann verfügbar,
für die Elemente vielleicht instanceof-Test
da wäre die Frage, ob die Objekte in der Liste ein bestimmtes Interface implementieren - müssen -.
Dann kannst du, nach dem Cast auf java.util.List, das Objekt an der jeweiligen Stelle auf das Interface casten und damit arbeiten,
Falls die Liste jedoch beliebige Objekte enthalten kann, dann wirst du um eine instanceof-Schlange, die alle möglichen enthaltenen Typen enthält nicht herum kommen.