Pigny: Abgespeicherte Objekte wieder einlesen

Servus alle miteinand,

ich hatte mich letzte Woche schon mal gemeldet (http://forum.de.selfhtml.org/archiv/2005/5/t107494/#m667567) weil ich da wissen wollte wie man Objekte abspeichern kann. Wurde mir sehr schnell mit dem Rat "Serialisierung ist das Zauberwort" geholfen. Gesagt getan, nun steck ich wieder fest.
Hab mir ein Feld von Typ user_object erstellt und diese auch erfolgreich abgespeichert. Alles in eine Datei, so wie ich mir das vorgestellt hab. ABER..

.. nun komme ich nicht weiter, weil ich nicht weiß, wie ich diese ca.100 Objekte wieder in mein user_object-Feld zurückschreiben kann.
Mit einzelnen Objekten funktioniert das hervorragend, aber mit einem Feld haut's nich hin.

Ich hoffe Ihr könnt mir wieder so schnell helfen, ich Dank Euch schonma

Pigny

  1. Hallo!

    Ich bin zwar nicht der Java-Crack, aber in PHP gibt es auch diese Serialisierung. Und da gibts zum Rückkonvertieren eine Funktion namens "unserialize"... vielleicht gibts in Java ja auch was ähnliches?

    viel glück ;-)

  2. Hallo,

    .. nun komme ich nicht weiter, weil ich nicht weiß, wie ich diese ca.100 Objekte wieder in mein user_object-Feld zurückschreiben kann.
    Mit einzelnen Objekten funktioniert das hervorragend, aber mit einem Feld haut's nich hin.

    Was haut nicht hin? Gibt es Fehler? Ist der gelesene Wert falsch? Gib
    mal eine etwas genauere Fehlerbeschreibung, bitte. Poste ggf. ein
    bißchen relevanten Code mit.

    Gruß
    Slyh

    1. Na Hallo,

      ich dank Dir erstma für Deine Hilfe vom letzten ma!

      Also ich hab eine Funktion für's Serialisieren:

      public void writeUser(UserObject Obj[]){
      File tmp = new File(FilePath);
      tmp.mkdir();

      try{
        ObjectOutputStream objOut = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(FilePath+"\"+FileName)));
        for(int i=0;i<Obj.length;i++){
         objOut.writeObject(Obj);
        }
        objOut.close();
      }
      catch(FileNotFoundException fne){
        System.out.println("ObjectWriter: Datei konnte nich gefunden werden!\n"+fne);
      }
      catch(IOException e){
        System.out.println("ObjectWriter: Es ist ein Fehler beim oeffnen aufgetreten!\n"+e);
      }
      }

      Da übergeben ich nur die Referenz des Feldes und schreibe die Daten raus.

      Ich hab mir das so vorgestellt, dass ich mir wieder ein Feld anlege:

      UserObject kunden[] = new UserObject[100];

      und dieses da an die zweite Funktion einfach übergebe:

      rw_data.ReadUser(kunden);

      und die Daten in diesem Objekt-Feld aufnehme.
      Mein Entwurf für die Read-Funktion sieht bis jetzt wie folgt aus:

      public void ReadUser(UserObject Obj[]){

      try{
        ObjectInputStream objIn = new ObjectInputStream(new BufferedInputStream(new FileInputStream(FilePath+"\"+FileName)));
        for(int i=0;i<Obj.length;i++) Obj[i] = (UserObject)ObjIn.readObject();
        ObjIn.close();
      }
      catch(FileNotFoundException fne){
        System.out.println("ObjectReader: Datei konnte nich gefunden werden!\n"+fne);
        }
      catch(IOException e){
        System.out.println("ObjectReader: Es ist ein Fehler beim oeffnen aufgetreten!\n"+e);
      }
      catch(ClassNotFoundException cne){
        System.out.println("ObjectReader: Diese Funktion wird leider nicht unterstützt!\n"+cne);
      }
      }

      aber die FOR-Schleife haut nich hin. Das weiß ich schon mal. Aber ich weiß nicht, was ich anders machen soll. Wie komm ich, nach dem ich ein Objekt ausgelesen habe zum nächsten?

      Ich hoffe Du kannst was damit anfangen..

      Grüsse Pigny

      P.S.:
      Fehlermeldung:
      Exception in thread "main" java.lang.ClassCastException
               at rw_data.ReadUser(rw_data.java:125) ->is in der for-Schleife
               at test.main(test.java:43)-> der Funktionsaufruf

      1. Hallo Pigny,

        Ich habe das gerade mal ausprobiert und kann problemlos mehrere Objekte ausgeben und einlesen.
        Das ist allerdings ohnehin unnötig kompliziert. Arrays sind in Java auch Objekte, wenn auch etwas ungewöhnliche.
        Du kannst also direkt einen ganzen Array serialisieren.

        Mein Testprogramm:

          
        import java.io.*;  
          
        public class test {  
          
                public static void main(String[] argv) throws Exception {  
                        String[] objs = new String[] {"abc", "asd", "blub"};  
          
                          ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("test.dat"));  
                        for(String s: objs) {  
                                out.writeObject(s);  
                        }  
                        out.close();  
          
                        objs = new String[3];  
          
                        ObjectInputStream in = new ObjectInputStream(new FileInputStream("test.dat"));  
                        for(int i = 0; i < objs.length; i++) {  
                                objs[i] = (String)in.readObject();  
                                System.out.println(objs[i]);  
                        }  
                        in.close();  
          
                        //Einfacher:  
                        objs = new String[] {"abc", "asd", "blub"};  
                        out = new ObjectOutputStream(new FileOutputStream("test.dat"));  
                        out.writeObject(objs);  
                        out.close();  
          
                        in = new ObjectInputStream(new FileInputStream("test.dat"));  
                        objs = (String[])in.readObject();  
                        for(String s: objs) {  
                                System.out.println(s);  
                        }  
                }  
        }  
        
        

        Grüße

        Daniel

        1. Hallo Daniel,

          erstma Danke!
          Ich hab das jetzt wie folgt:

          public void writeUser(UserObject obj[]){
          ...
          out.writeObject(obj);
          ...
          }

          public void readUser(UserObject obj[]){
          ...
          obj = (UserObject)in.readObject();
          ...
          }

          UserObject kunden1[] = new UserObject[10];
          UserObject kunden2[] = new UserObject[10];

          writeUser(kunden1);
          readUser(kunden2);

          System.out.println(kunden2[]); //bla bla zum Testen

          Wenn ich das so durchlaufen lasse, bring der mir eine NullPointerException für die Zeile mit der Ausgabe.
          Woran könnte das liegen?

          Pigny

        2. Ups, hab grad gesehn das ich ein Fehler beim posten gemacht hab:

          public void readUser(UserObject obj[]){
          ...
          obj = (UserObject[])in.readObject();
          ...
          }

          Also in meinem Quellcode hab ich die eckigen Klammer drin!!

          Nich das Du denkst, da is der Fehler.

        3. Ach und hab mal noch eine Frage:

          Kannst Du mir vielleicht mal kurz erklären was genau in der Schleife passiert? Diese schreibweise hab ich noch nie gesehn..

          for(String s: objs) System.out.println(s);

          1. Hallo Pigny,

            Vermutlich rufst Du writeObject auf eine null-Referenz auf. Den entsprechenden Code hast Du ja nicht gepostet.

            for(String s: objs) System.out.println(s);

            Das entspricht:
            for(int i = 0; i < objs.length; i++) {
                String s = objs[i];
                //Code in der Schleife.
            }

            Die Syntax gibt es ab Java 1.5 für Arrays und alle Objekte, die java.lang.Iterable implementieren. (z.B. alle von Collection abgeleiteten Klassen)
            Ist eher eine unbedeutetende Neuerung, aber einfach schneller zu schreiben.
            Meistens interessieren einen die Laufvariable (oder der Iterator) ja nicht.

            Grüße

            Daniel

            1. Hallo Daniel,

              Vermutlich rufst Du writeObject auf eine null-Referenz auf.

              Also kunden1[] hat Daten. Kann ich mir auch anzeigen lassen. ID, Name, Geb etc. Und wenn ich es abspeichere, erstellt er mir ja auch das File. Und wenn ich es mit der for-Schleife mache (also der komplizierteren Methode), funktioniert es auch. Es funktioniert halt nur nich, wenn ich das Array als ganzes abspeichern will.
              Und mal noch ne andere Frage, kann man das irgendwie "verallgemeinern", sprich das ich die Methoden auch mit anderen Typen von Objekten nutzen könnte?
              Mal davon abgesehn das ich sie überladen könnte..

              Grüsse Pigny

              1. Hallo Pigny,

                Welche Javaversion benutzt Du? Wenn es 1.5 ist, könntest Du ja einfach mal mein Beispiel ausprobieren. (Ansonsten müsstest Du die for-schleifen umbauen)

                Vermutlich rufst Du writeObject auf eine null-Referenz auf.

                Ich meinte nicht, dass das Argument null ist. Es spielt sowieso keine Rolle, ob der Array Daten enthält, den kann man auch ohne Daten serialisieren.
                Ich meinte, das bei out.writeObject(...) out null ist.

                Und mal noch ne andere Frage, kann man das irgendwie "verallgemeinern", sprich das ich die Methoden auch mit anderen Typen von Objekten nutzen könnte?

                Naja da noch irgendwo eine zentrale Methode zu schreiben ist ja fast überflüssig. Serialisieren/deserialisieren benötigt ja jeweils nur drei Zeilen code und so oft macht man das in einer Anwendung ja idR auch nicht, da man ja ganze Datenstrukturen auf einen Schlag serialisieren kann.

                Grüße

                Daniel