Also ich hab mich jetzt schon durch google gewuehlt, und auch hier im Forum noch nix gefunden, daher jetzt mein Problem:
Ich habe eine LinkedList<Personendaten> serializiert in einer Datei gespeichert.
Soweit so gut, jetzt will ich das ding wieder laden:
Java:
/**
* Read LinkedList Object from file.
* @return LinkedList<Personendaten>
*/publicstaticLinkedList<Personendaten>loadObjectfromFile(File fileName){InputStream fis =null;LinkedList<Personendaten> result =null;try{
fis =newFileInputStream( fileName );ObjectInputStream o =newObjectInputStream( fis );
result =(LinkedList<Personendaten>) o.readObject();}catch(IOException e ){System.err.println("Help");}catch(ClassNotFoundException e ){System.err.println( e );}finally{try{ fis.close();}catch(Exception e ){}}return result;}
Folgenden Fehler bekomme ich:
Code:
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: [Ljava.lang.String; cannot be cast to java.util.LinkedList
at GSTSharedProjectFiles.FileWorking.FileWorker.loadObjectfromFile(FileWorker.java:352)
/**
*
* Writes one Object in a File.
* @param fileName
* @param nameList
*/publicstaticvoidwriteSingleObjectInFile(File fileName,Object object){OutputStream fos =null;try{
fos =newFileOutputStream(fileName );ObjectOutputStream o =newObjectOutputStream( fos );
o.writeObject(object);}catch(IOException e ){System.err.println( e );}finally{try{
fos.close();}catch(Exception e ){}}}
Und du bist dir sicher, dass du der Methode [c]writeSingleObjectInFile[/c] eine LinkedList<Personendaten> übergibst und nicht einen String?/edit: bzw String-Array?
Zeige mal den Aufruf ^^
ich habe leider schon wieder ein Problem mit der Methode...
Java:
/**
* Read LinkedList Object from file.
* @return LinkedList<String>
*/publicstaticObjectloadObjectfromFile(File fileName){InputStream fis =null;Object result =null;try{
fis =newFileInputStream(fileName);ObjectInputStream o =newObjectInputStream(fis);
result = o.readObject();}catch(IOException e ){System.err.println("IO Exception in loadObjectfromFile");}catch(ClassNotFoundException e ){System.err.println("Class not found excepton in LoadObjectFromFile");}finally{try{ fis.close();}catch(Exception e ){}}return result;}
Welche ich wie folgt aufrufe:
Java:
publicstaticvoid main (String[] args){File file =newFile("Altenpfleger.txt");System.out.println(loadObjectfromFile(file));}
die Exception ausgeben (e.printStackTrace() ) willst du nicht, obwohl das einfachste Fehler wie falschen Pfad anzeigen würde?
-----
bisher fehlt ein Anhang,
von meinem 'vollständiges Programm'-Ansatz, im anderen Thema gar komplett vorgesetzt http://www.java-forum.org/java-basi...jectinputstream-beim-einlesen-linkedlist.html
hälst du immer noch nix?
an einer bestimmten Datei kann alles mögliche schief sein, vielleicht hast du im Editor ein Byte umgesetzt, bringt doch nix
run:
java.io.InvalidClassException: GSTSharedProjectFiles.ApplicationData.Personendaten; local class incompatible: stream classdesc serialVersionUID = 2041391104374300978, local class serialVersionUID = 3580439621773860946
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:562)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1583)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1496)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1732)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
at java.util.LinkedList.readObject(LinkedList.java:964)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1849)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
null
at GSTSharedProjectFiles.FileWorking.FileWorker.loadObjectfromFile(FileWorker.java:372)
at GSTSharedProjectFiles.FileWorking.FileWorker.main(FileWorker.java:37)
BUILD SUCCESSFUL (total time: 0 seconds)
Uhm, um ehrlich zu sein, nein ,den ganzen Code moechte ich nicht hochladen.
Hierbei handelt es sich naemlich um ein Geflecht aus mitlerweile 3 verschiedenen Geschriebenen Programmen die ca. 50 Klassen umfassen, und ausserdem Serverdaten von dem Firmenserver enthalten (die ich, verstaendlicherweise, nicht sooo ger weitergeben moechte ).
"Bei der Serialisierung wird in Java nicht nur der Objektinhalt geschrieben, sondern zusätzlich eine eindeutige Kennung der Klasse, die UID. Die UID ist ein Hashcode aus Namen, Attributen, Parametern, Sichtbarkeit und so weiter. Sie wird als long wie ein Attribut gespeichert. Ändert sich der Aufbau einer Klasse, ändert sich der Hashcode und damit die UID. Klassen mit unterschiedlicher UID sind nicht kompatibel. Erkennt der Lesemechanismus in einem Datenstrom eine UID, die nicht zur Klasse passt, wird eine InvalidClassException ausgelöst. Das bedeutet, dass schon ein einfaches Hinzufügen von Attributen zu einem Fehler führt."
wie sollte irgendjemand anders eine Datei einer unbekannten Klasse öffnen?
die Fehlermeldung besagt, dass du unterschiedliche .class-Dateien beim Schreiben und Lesen benutzt,
richtig ein Problem wäre, wenn die Klasse zwischendurch verändert wird, der Fehler kann aber schon bei reinem Neukompilieren auftreten
(edit: letzteres widerspricht anscheinend der Definition, will ich nicht beschwören, war aber bisher mein Eindruck),
anders gehts nicht soweit mir bekannt,
idealerweise weiß man vorher was drinsteht oder wieviele Objekte,
man kann ja immer leicht alle Objekte in eine Liste oder sonst ein höheres Objekt stecken und nur dieses EINE Objekt schreiben (und wieder lesen),
dann hat man alle anderen Java-mäßig mit get(), size() usw.