Komische Zeichen im Zusammenhang mit Serializable interface

Taso44

Aktives Mitglied
Guten Tag,
habe ein denke kleines Problem:
Ich bin gerade dabei eine Datei (Endung: .ser) zu befüllen und dann (im Konstruktor einer Verwaltungsklasse für Studenten) einzulesen.
Klappt glaube ich, da ich irgendwie was auf dem Dokument sehen. Nur ist das was ist sehe
nur ein Buchstabensalat oder so etwas. Da stehen zum Teil Fragezeichen in Kästchen, die Attribute die ich habe kann man lesen aber der Wert
dazu ist auch nicht da..... Ich weiß echt nicht was da hingeschrieben wurde.
Ich dachte daran dass man das auf UTF8 setzen muss oder so aber das klappt auch nicht.

Folgende Methoden nutze ich gerade:

Java:
    public void dateiAuslesenStudenten(Student s) {
        File file= new File("resource/Studentenverwaltungdokument.ser");
    
        try(FileOutputStream outputstream = new FileOutputStream(file);
            ObjectOutputStream objectoutputstream = new ObjectOutputStream (outputstream);){     
            
            objectoutputstream.writeObject(s);
        
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
    public Student dateiEinlesenStudenten() {
        Student student = null;
        
        File file= new File("resource/Studentenverwaltungdokument.ser");
        
        try(FileInputStream inputstream = new FileInputStream(file); 
            ObjectInputStream objectinputstream = new ObjectInputStream(inputstream);) {
            
            
            student = (Student) objectinputstream.readObject();
        System.out.println(student.toString());   
        } catch(FileNotFoundException e ) {
            e.printStackTrace();
        } catch (IOException e ) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        return student;
        
    }

Diese Methoden sind in einer Klasse die ich für die Verwaltung von Studenten nutze.
Natürlich haben die Studenten Attribute wie Name, Studiengang, Semesterzahl usw.,
die habe ich hier in den Methoden nicht vorhanden. Liegt es vielleicht daran?

Vielleicht kann mir ja einer von euch helfen.
Danke
 
Zeige den ganzen Code eines kleinen Beispiels incl. einer genaueren Bewchreibung. Mit der Fehlerbeschreibung ist so erst einmal nichts anzufangen.
 
Zeige den ganzen Code eines kleinen Beispiels incl. einer genaueren Bewchreibung. Mit der Fehlerbeschreibung ist so erst einmal nichts anzufangen.
ok, mache ich,
code:
Java:
//Klasse Studentetnverwaltung
public class Verwaltung implements Serializable {

/**
     *
     */
    private static final long serialVersionUID = 5820330651095851541L;
    ArrayList <Student> liste; //Studenten
    private ArrayList<Prüfung> prüfungen;
    private final static long SerialVersionUID=1;
   
    //Konstruktor
    public Verwaltung() throws FileNotFoundException, IOException, ClassNotFoundException {
        liste = new ArrayList<Student>();
 
        dateiEinlesenStudenten();
        prüfungen = new ArrayList<>();
       
//        dateiEinlesenPrüfungen();
    }
   
    public void dateiAuslesenStudenten(Student s) {
        File file= new File("resource/Studentenverwaltungdokument.ser");
   
        try(FileOutputStream outputstream = new FileOutputStream(file);
            ObjectOutputStream objectoutputstream = new ObjectOutputStream (outputstream);){    
           
            objectoutputstream.writeObject(s);
       
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
   
    public Student dateiEinlesenStudenten() {
        Student student = null;
       
        File file= new File("resource/Studentenverwaltungdokument.ser");
       
        try(FileInputStream inputstream = new FileInputStream(file);
            ObjectInputStream objectinputstream = new ObjectInputStream(inputstream);) {
           
           
            student = (Student) objectinputstream.readObject();
        System.out.println(student.toString());  
        } catch(FileNotFoundException e ) {
            e.printStackTrace();
        } catch (IOException e ) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
       
        return student;
       
    }
   

        //Create    
    public void studentErzeugen( String name, String vorname, String studiengang, int semesterzahl, String gebDatum) throws FileNotFoundException, IOException, ClassNotFoundException {
       
        Student studie = new Student(name, vorname, studiengang, semesterzahl, gebDatum);
           
           
       
        liste.add(studie);
            System.out.println();
//            schreibeInListe();  //ein-auslesen mit pritwriter
            for (int i = 0; i < liste.size(); i++) {
                dateiAuslesenStudenten(liste.get(i));  
            }
    }
               
        //Delete
        public void löscheStudent(int matrikelnummerDesStudenten) throws FileNotFoundException, IOException {
           
            for (int i = liste.size()-1; i >=0 ; i--) {
                if(liste.get(i).getMatrikelnummer() == matrikelnummerDesStudenten) {  // sucht den Studenten in der Liste
                    liste.removeIf(e -> e.getMatrikelnummer() ==  matrikelnummerDesStudenten );
                }

            }
           
//            schreibeInListe();
            dateiAusnlesenStudenten();
        }
       
        //Name UPdate
        private void nameUpdate(Student s, String name) {
            s.setName(name);
        }
       
       
        //Vorname Update
        private void vornameUpdate(Student s, String vorname) {
            s.setVorname(vorname);
        }
       
        //Studiengang Updaten
        private void studiengangUpdate(Student s, String studiengang) {
            s.setStudiengang(studiengang);
        }
       
        //Semesterzahl Updaten
        private void semesterzahlUpdate(Student s, int semesterzahl) {
            s.setSemesterzahl(semesterzahl);;
        }
       
        //Geburtstag Updaten
        private void geburtsdatumUpdate(Student s, String gebDatum) {
            s.setGebDatum(gebDatum);;
        }
               
       
        //Update
        public void studentUpdaten(int matnummer, int wahl, String name, String vorname, String studiengang, int semesterzahl, String gebDatum) {            
            for (int i = 0; i < liste.size(); i++) {
                if(liste.get(i).getMatrikelnummer() ==  matnummer) {
                    if(wahl == 1 ) { //name  
                        nameUpdate(liste.get(i), name);
                        break;
                    } else if(wahl ==2 ) { //vorname
                        vornameUpdate(liste.get(i), vorname);
                        break;
                    } else if(wahl == 3) { //studengang
                        studiengangUpdate(liste.get(i), studiengang);
                        break;
                    } else if(wahl == 4) {
                        semesterzahlUpdate(liste.get(i), semesterzahl);
                        break;
                    } else if(wahl == 5) {
                        geburtsdatumUpdate(liste.get(i), gebDatum);
                        break;
                    }
                   
                }
             }
            schreibeInListe();

        }
       
        public void studentAbrufen(int mnummer) throws Exception{
           
            for (int i = 0; i < liste.size(); i++) {
                if(liste.get(i) != null && liste.get(i).getMatrikelnummer() == mnummer) {
                    System.out.println(liste.get(i).toString());
                    return;
                }
               
            }  
            throw new Exception("Es gibt keinen Studenten mit dieser Matrikelnummer");
        }

}

//Klasse Student

public class Student implements Serializable {  
   
   
    /**
     *
     */
    private static final long serialVersionUID = 5785525338533322764L;
    //Attribute
    private static int counter = 2220001;
    private String name;
    private String vorname;
    private final int matrikelnummer;
    private String studiengang;
    private int semesterzahl;
    private String gebDatum;
    private ArrayList<Prüfung> aktuellePrüfungen = new ArrayList<>();  //Prüfungen, die der (einzelne) Student schreibt
   
    //Konstruktor
    public Student(String name, String vorname, String studiengang, int semesterzahl, String gebDatum) {
        this.name = name;
        this.vorname =  vorname;
        this.matrikelnummer =  counter++;
        this.studiengang = studiengang;
        this.semesterzahl =  semesterzahl;
        this.gebDatum =  gebDatum;
    }
   

    //Prüfung hinzufügen
    public void prüfungHinzufügen(Prüfung p) {
        aktuellePrüfungen.add(p);
    }
   

   
    //Getter und Setter
   
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getVorname() {
        return vorname;
    }

    public void setVorname(String vorname) {
        this.vorname = vorname;
    }

    public int getMatrikelnummer() {
        return matrikelnummer;
    }

    //Kein SetMatrikelnummer da final

    public String getStudiengang() {
        return studiengang;
    }

    public void setStudiengang(String studiengang) {
        this.studiengang = studiengang;
    }

    public int getSemesterzahl() {
        return semesterzahl;
    }

    public void setSemesterzahl(int semesterzahl) {
        this.semesterzahl = semesterzahl;
    }

    public String getGebDatum() {
        return gebDatum;
    }

    public void setGebDatum(String gebDatum) {
        this.gebDatum = gebDatum;
    }
   
   
    //ToString  (generiert von eclipse, jedoch etwas in die eigene (lesbarere Version) umgeändert)
    @Override
    public String toString() {
        return  name + "," + vorname + "," +  matrikelnummer  + "," +
                 studiengang + "," + semesterzahl + "," +  gebDatum;
    }
   
}

Ich nutze noch eine Textuelle UI aber, die ist nur für Benutzereingabe gedacht, also wie "Geben Sie den Namen des Studenten ein".

Was Neues: Wollte es gerade nochmal ausprobieren gab aber jetzt nur noch eine Exception:
Exception in thread "main" java.lang.ClassCastException: class facade.Verwaltung cannot be cast to class domain.Student (facade.Verwaltung and domain.Student are in unnamed module of loader 'app')
at facade.Verwaltung.dateiEinlesenStudenten(Verwaltung.java:72)




Danke sehr
 
Laut meiner Prof hätten wir folgendes für die ObjectOutputstream nutzen können, hat bei mir leider nicht funktioniert

  • ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("persistence/sv.ser"));
  • oos.writeObject(sv);
  • oos.close();
Wieder einlesen :
  • ObjectInputStream ois = new ObjectInputStream(new FileInputStream("persistence/sv.ser"));
  • Studienverwaltung sv = (Studienverwaltung) ois.readObject();
  • ois.close();
 
Ok, die Exception ist gekommen, da Du in die Datei vermutlich eine Verwaltung Instanz geschrieben hast, aber beim lesen willst Du ein Studenten lesen. Daher die Exception, denn aus Verwaltung kannst Du keinen einzelnen Studenten machen.

Das Problem, das ich hier sehe, ist aber etwas anderes. Kannst Du evtl. erst einmal in Worten beschreiben, was Du genau machen willst?
Hintergrund ist, dass Du ja doch bestimmt nicht einen einzelnen Studenten schreiben bzw. lesen willst. Daher wäre es wichtig, dass Du erst einmal genau beschreibst, was Du in der Datei haben willst. Da Verwaltung Serializable ist, kannst Du das durchaus komplett schreiben. Oder Du schreibst nur, was da an zu sichernden Daten drin ist (also die Liste der Studenten und die Liste der Prüfungen). Das geht aber beides.

Dann musst Du überlegen, wie die Methoden aussehen. Da brauchst Du dann keine Parameter Student oder so. Da kannst Du also einfach sowas wie speichern und laden machen.

Und die Nutzung der ObjectStreams ist prinzipiell in Ordnung. (Daher konnte ich bei dem ersten Auszug auch noch nicht wirklich was zum Code sagen.
 
Ok, die Exception ist gekommen, da Du in die Datei vermutlich eine Verwaltung Instanz geschrieben hast, aber beim lesen willst Du ein Studenten lesen. Daher die Exception, denn aus Verwaltung kannst Du keinen einzelnen Studenten machen.

Das Problem, das ich hier sehe, ist aber etwas anderes. Kannst Du evtl. erst einmal in Worten beschreiben, was Du genau machen willst?
Hintergrund ist, dass Du ja doch bestimmt nicht einen einzelnen Studenten schreiben bzw. lesen willst. Daher wäre es wichtig, dass Du erst einmal genau beschreibst, was Du in der Datei haben willst. Da Verwaltung Serializable ist, kannst Du das durchaus komplett schreiben. Oder Du schreibst nur, was da an zu sichernden Daten drin ist (also die Liste der Studenten und die Liste der Prüfungen). Das geht aber beides.

Dann musst Du überlegen, wie die Methoden aussehen. Da brauchst Du dann keine Parameter Student oder so. Da kannst Du also einfach sowas wie speichern und laden machen.

Und die Nutzung der ObjectStreams ist prinzipiell in Ordnung. (Daher konnte ich bei dem ersten Auszug auch noch nicht wirklich was zum Code sagen.
Hi,
Also ich habe im Grunde hier wie du siehst ein Klasse Student (die Prüfungen könnten wir erstmal außen vor lassen) außerdem habe ich die Klasse Verwaltung. Die Verwaltet halt die Studenten. Ich habe in der Verwaltung die Liste mit den Studenten. Es geht im Grunde darum die Studenten zu erzeugen, sie abzurufen, sie wieder zu löschen etc. Und das alles in der Liste, weil ich diese in einem Dokument speichern will. Vorerst war das in einer CSV - Datei(hatte im Grunde gut funktioniert), aber mir wurde die Aufgabe gestellt, die das ein und auslesen der CSV-Datei (welche ich mit PrintWriter gemacht habe) zu ersetzen, unswar mit dem ObjectOutputStream. Ich habe die Logik so versucht umzuändern dass sie passt, aber ich bekomme eine ungewöhnliche Exception nach der anderen.

Soweit mein "Plan".

Dankeschön
 
Ok neues update,
es scheint als hätte ich es geschafft, dass keine Exceptions mehr im Moment kommen, leider hat meine .ser Datei immernoch komische Zeichen und. Das einzige was ich rauskopieren konnte ist: "¬í". Der Rest ist wie ganz oben gesagt eine Mischung aus Kästchen mit Fragezeichen und, ich glaube, Verweise auf meine Packages und die Attribute. Ich bin mir gar nicht sicher ob da überhaupt etwas (richtiges) gespeichert wird...

Danke nochmal
 
Die Datei über einen ObjectInputStream wieder einlesen.
Habe ich eigentliche, siehst du hier einen Fehler? Denn es klappt trotz dessen nicht.
Java:
public Student dateiEinlesenStudenten() {
        Student student = null;
        File file= new File("resource/Studentenverwaltungdokument.csv");
        
        try(FileInputStream inputstream = new FileInputStream(file); 
            ObjectInputStream objectinputstream = new ObjectInputStream(inputstream);) {
            student = (Student) objectinputstream.readObject();
//        System.out.println(student.toString());   
            inputstream.close();
        } catch(FileNotFoundException e ) {
            e.printStackTrace();
        } catch (IOException e ) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        return student;
        
    }
 
Du versuchst eine csv Datei per ObjectInputStream einzulesen und erwartest dabei ein einziges Student-Objekt, vermutlich ist beides fehlerhaft.

Du solltest die Datei, in die du geschrieben hast, nutzen, und dann auch den Typ nutzen, den du geschrieben hast, das ist vermutlich nicht Student.
 
Sorry hatte die csv endung in ser schon umgeändert.
Meinst du damit ich soll gleich die gante Liste mit den Studenten ausgeben?
Code:
public ArrayList dateiEinlesenStudenten() {
        Student student = null;
        dateiAuslesenStudenten(student);
        File file= new File("resource/Studentenverwaltungdokument.ser");
        
        try(FileInputStream inputstream = new FileInputStream(file); 
            ObjectInputStream objectinputstream = new ObjectInputStream(inputstream);) {
            for (int i = 0; i < liste.size(); i++) {
            student =    liste.get(i);
            student = (Student) objectinputstream.readObject();
            }
            
    
//        System.out.println(student.toString());   
            inputstream.close();
        } catch(FileNotFoundException e ) {
            e.printStackTrace();
        } catch (IOException e ) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        dateiAuslesenStudenten(student);
        
        return liste;
        
    }

klappt halt leider auch nicht
 
Bitte formuliere erst einmal in Worten, was Du machen willst! Dazu nimmst Du Dir einen einzigen sogenannten Usecase und spielst den durch!

Beim Laden der Studenten kann es also z.B. der Zustand nach dem Starten sein. Die Liste de Studenten im Speicher ist leer und Du lädst eine Datei mit mehreren Studenten.

Da ist dann doch klar: Ein Durchgehen der Liste von Studenten im Speicher ist absoluter Quatsch!

Wenn Du also en Usecase: Laden von Studenten betrachtest, dann wäre dies ein:
- Öffne die Datei
- So lange wie möglich:
--> Lade einen Studenten
--> Mache etwas mit dem geladenen Studenten

Dabei habe ich jetzt natürlich relativ wenig Details gegeben. Das "mache etwas" solltest Du sinnvoll formulieren!

Und das ist wirklich kein "Kinderkram" oder so. Du magst Dir sowas zwar denken, aber Deine Herangehensweise zeigt deutlich, dass genau dies notwendig ist!

Und wenn Du etwas so formuliert hast, dann schreibe den Code auch so. Also das wäre dann wirklich Code mit Dingen wie:
Student student = loadStudentFromOpenFile(...);
doSomething(student);
--> So hast Du kleine Code-Teile, die Du - so Du klar formuliert hast, was da passieren soll - selbst gut verstehen und überblicken kannst!
 

Zurück
Oben