2016-07-20 11 views
2

Der folgende Code gibt mir den Fehler InvalidClassException Meine User Klasse implementiert Serializable so bin ich verloren. Ich versuche, list gefüllt mit User Objekte zu speichern und dann in der Lage sein, es zurück zu lesen.lokale Klasse inkompatible Fehler

List<User> userList = new ArrayList<User>();//list used 
try { 
    ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(fileName, true)); 

    os.writeObject(userList); 
    os.close(); 
} catch (IOException e1) { 
    e1.printStackTrace(); 
} 

// input 
try { 
    ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fileName)); 
    userList = (List<User>) ois.readObject(); 
    ois.close(); 
} catch (FileNotFoundException e1) { 
    e1.printStackTrace(); 
} catch (IOException e1) { 
    e1.printStackTrace(); 
} catch (ClassNotFoundException e1) { 
    e1.printStackTrace(); 
} 
+0

Sie verwenden "append" 'new FileOutputStream (fileName, true)' ... Wurde Ihre Datei leer gestartet? Die Datei beginnt möglicherweise mit ungültigen Inhalten aus früheren Tests. Löschen Sie es und wiederholen Sie den Test. – AJNeufeld

+0

Danke, dass es funktioniert hat, gibt es einen Weg, dies in Zukunft zu vermeiden? –

+0

Err, ja, nicht an Objekt-Ausgabe-Streams anhängen. Dies würde jedoch einen anderen Fehler verursachen. Der Fehler hier ist, dass sich die lokale Klasse unterscheidet sich von der Klasse, wie es war, als es serialisiert wurde, auf eine Weise, die in der Fehlermeldung erwähnt wird, die Sie nicht hilfreich zur Verfügung gestellt haben. – EJP

Antwort

1

Wenn Sie versuchen, ein einzelnes Objekt (ein List<> in Ihrem Beispiel) in einer Datei zu speichern und später wieder abrufen, tun Sie nicht wollen anhängen in die Datei jedes Mal, wenn Sie schreibe dazu. Eher möchten Sie die Datei jedes Mal überschreiben, mit dem neuen Objekt.

// Write 
List<User> userList = new ArrayList<User>(); 
try (FileOutputStream fos = new FileOutputStream(fileName); 
     ObjectOutputStream oos = new ObjectOutputStream(fos)) { 
    oos.writeObject(userList); 
} catch (IOException e1) { 
    e1.printStackTrace(); 
} 

// read 
try (FileInputStream fis = new FileInputStream(fileName); 
     ObjectInputStream ois = new ObjectInputStream(fis)) { 
    userList = (List<User>) ois.readObject(); 
} catch (FileNotFoundException | IOException | ClassNotFoundException e1) { 
    e1.printStackTrace(); 
} 

Hinweis new FileOutputStream(fileName) tut nicht haben die true Argument. Das Argument true zeigt an, dass Sie die Datei für "append" öffnen möchten. Wenn Sie false verwenden oder das Argument append vollständig auslassen, wird die Datei für "Überschreiben" geöffnet.

Hinweise:

Ich habe auch die mein Beispiel try-with-resources Aussage. Dadurch müssen die Streams nicht explizit geschlossen werden. Die Streams werden automatisch am Ende des Blocks try { } für Sie geschlossen.

Ich habe auch die multi-catch Klausel verwendet, weil Sie die 3 Ausnahmen nicht anders behandeln, so ist es ein bisschen sauberer.

+0

Ja !!, Vielen Dank, dass ich deswegen verrückt geworden bin. –

+0

Würde dies gespeicherte Informationen (Benutzer) in der Datei löschen, die bereits erstellt wurde? @AJNeufeld? –

+0

Der obige Code schreibt die gesamte "Liste " als ein Objekt und zerstört alles, was in dieser Datei war. Wenn Sie Benutzer hinzufügen/ändern/entfernen möchten, würden Sie die gesamte Liste einlesen (falls die Datei vorhanden ist), die erforderlichen Änderungen an der Liste vornehmen und die Liste in die Datei schreiben. – AJNeufeld