Serialize mit mehreren Klassen?



  • Ich möchte ein Vokabelprogramm schreiben und habe dafür eine kleine Ansammlung von Klassen gebastelt. Leicht vereinfacht sieht es so aus:

    Wort: Stellt jeweils ein Wort dar
    Übersetzungsliste: Speichert alle Übersetzungen zu einem Wort
    Wortliste: Enthält alle Wörter einer Sprache

    Ich möchte nun eine Wortliste abspeichern, was auch dank Serialize-Interface und der Methode save() funktioniert. Ich habe mir die erzeugte Datei mal angesehen und meine - trotz kryptischer Zeichen - zu erkennen, dass offenbar alle Informationen gespeichert worden sind.

    Beim Laden mit der Methode load() geht allerdings nicht alles so glatt. Da werden nur die Variablen der Wortliste geladen, die einzelnen enthaltenen Wörter jedoch nicht.
    Gibt es eventuell ein Problem beim Laden von Objekten, die wiederum Objekte anderer Klassen enthalten?

    Gruß Flo



  • Vielleicht solltest du uns mal die Speicher- und Laderoutine mal hier posten. Dann kann man wahrscheinlich mehr sagen. Zeige vor allem auch, wie ein Wortlisten-Objekt aussieht (Modifikatoren etc.).



  • Oh, da hast Du natürlich Recht. Ich habe nicht schreiben wollen, dass ich eine save- und eine load-Methode habe (das hat wohl keinen besonderen Informationswert). Ich wollte schreiben, dass ich mit FileOutputStream / ObjectOutputStream und FileInputStream / ObjectInputStream arbeite.

    So sieht WordList aus (nicht relevante Methoden habe ich weggelassen):

    public class WordList implements IWordList, java.io.Serializable {
      Word first;
      Word last;
      byte language;
      int current_id;
    
      public void save(String filename) {
        try {
          java.io.FileOutputStream file = new java.io.FileOutputStream(filename);
          java.io.ObjectOutputStream out = new java.io.ObjectOutputStream(file);
          out.writeObject(this);
          out.flush();
          out.close();
        }
        catch (java.io.NotSerializableException ex) {
          System.err.println("Not Serializable");
        }
        catch (java.io.InvalidClassException ex) {
          System.err.println("Invalid Class Exception");
        }
        catch (java.io.IOException IOE) {
          System.err.println("IOException");
        }
      }
    
      public WordList load(String filename) {
        try {
          java.io.FileInputStream file = new java.io.FileInputStream(filename);
          java.io.ObjectInputStream in = new java.io.ObjectInputStream(file);
          WordList wl = (WordList)in.readObject();
          in.close();
          return wl;
         }
         catch (java.io.IOException IOE) {
           System.err.println("IOException");
           return null;
         }
         catch (ClassNotFoundException cnfe) {
           System.err.println("ClassNotFoundException");
           return null;
         }
      }
    }
    


  • Wenn du Serializable implementierst, dann solltest du auch readObject und
    writeObject überschreiben. In diesen Methoden schreibst du dann
    deine Werte expliziet rein, also first, last, usw...
    In deiner save-Funktion rufst du dann writeObject mit einem FileOutputStream auf.

    Versuch's mal.

    Jockel


Anmelden zum Antworten