Serialisierung in Java

mortilus

Mitglied
Guten Abend, ich bin wieder da für ein neues Problem.
Mit diesem Programm muss ich einfach ein Objekt speichern.
Es geht, um sich registrieren und anmelden zu können, ich eine Main wo alles ausgeführt wird und zwei anderen Klassen: Benutzer --> da habe ich alle Get und set Methoden; dann AnmeldenRegistrien --> hier habe ich die zwei Methoden anmelden und registrieren; ich habe so programmiert, dass bei der Registrierung das Objekt Benutzer übergeben wird und später wird es in den ArrayList gespeichert. Bei der Methode Anmelden wird den Benutzername und das Passwort übergeben und einfach überprüft, ob sie mit dem Objekt, das in der ArrayList befindet, stimmt bzw gleich ist. Das Problem liegt eben beim Speicher des Objektes AnmeldenRegistrieren und ich habe keine Ahnung wieso.
Java:
public class Main {
    public static void main(String[] args) {
        String benutzer, password;

        int auswahl, x = 0;

        Scanner input = new Scanner(System.in);
        AnmeldenRegistrieren anmregi = new AnmeldenRegistrieren();

        while(x != 1) {
        System.out.println("*    Anmelden als User   <1>    *");
        System.out.println("*    Anmelden als Admin  <2>    *");
        System.out.println("*         Registrieren   <3>    *");
        System.out.println("*            EXIT        <4>    *");
        auswahl = input.nextInt();

            switch(auswahl){
            case 1:
                    System.out.println("Enlesung vom gespeicherten Object");
                    try {
                        ObjectInputStream is = new ObjectInputStream(new FileInputStream("data.ser"));
                        anmregi = (AnmeldenRegistrieren) is.readObject();
                        is.close();
                    } catch (FileNotFoundException e) {
                        System.out.println("File not found");
                    } catch (IOException e) {
                        System.out.println("Error");
                    } catch (ClassNotFoundException e) {
                        e.printStackTrace();
                    }

                    System.out.println("Geben Sie den Benutzername ein!");
                    benutzer = input.next();
                    System.out.println("Passwort eingeben!");
                    password = input.next();
                    anmregi.anmelden(benutzer, password);
                    if(anmregi.getZustand() == true){
                        System.out.println("Erfolgreiche Anmeldung");
                    }else{
                        System.out.println("Fehlgeschlagene Anmeldung");
                    }
                    break;
                case 2:
                    //Admin kommt später
                    break;
                case 3:
                    System.out.println("Geben Sie den Nickname ein!");
                    benutzer = input.next();
                    System.out.println("Geben Sie das Passwort ein!");
                    password = input.next();
                    anmregi.registrieren(new Benutzer(benutzer, password));

                    // Objekt wird gespeichert // Problem beim speichern
                    try {
                        ObjectOutputStream ou = new ObjectOutputStream(new FileOutputStream("data.ser"));
                        ou.writeObject(anmregi);
                        ou.close();
                    } catch (FileNotFoundException e) {
                        System.out.println("Klasse wurde nicht gefunden!");
                    } catch (IOException e) {
                        System.out.println("Error");
                    }

                break;
                case 4:
                    x = 1;
                break;
            }
        }
    }
}
Java:
public class AnmeldenRegistrieren {
    private Benutzer user;
    private boolean zustand;
    private ArrayList<Benutzer> usernameList = new ArrayList<>();

    public void registrieren(Benutzer user){
        usernameList.add(user);
        System.out.println(user.getUsername());
        System.out.println(user.getPassword());
    }
    public boolean anmelden(String nickname, String password){
        for(Benutzer i:usernameList){
            if(i.getUsername().equals(nickname) && i.getPassword().equals(password)){
                zustand = true;
            }else{
                zustand = false;
            }
        }
        return zustand;
    }
    public boolean getZustand(){
        return zustand;
    }
}
Java:
public class Benutzer {
    private String username;
    private String password;

    public Benutzer(String username, String password){
        this.username = username;
        this.password = password;
    }

    public String getUsername(){
        return username;
    }
    public String getPassword(){
        return password;
    }
}


Ich würde mich freuen, wenn mir eine Person helfen könnte! :)
 
Zuletzt bearbeitet von einem Moderator:

mortilus

Mitglied
Ok dann habe ich in der Klasse Benutzer das Interface Serializable implementiert, aber was meinen Sie mit "equals überschrieben ", entschuldigen Sie aber das verstehe ich nicht. Wo muss ich was und wo schreiben? :/ Ps. Danke für deine Antwort
 

looparda

Top Contributor
Sorry, ich habe gestern beim überfliegen nicht den kompletten Code überschaut, wegen fehlender Formatierung des Codes. Jetzt habe ich ich es mir jedoch genauer angesehen.
1. Du verschluckst die wertvollen Exception-Informationen in deinen catch-Blöcken.
So auch in jenem in den du hereinkommst:
Java:
 } catch (IOException e) {
    System.out.println("Error");
}
Besser:
Java:
 } catch (IOException e) {
    System.out.println("Error");
    e.printStackTrace();
}
Um überhaupt was mitzubekommen. Oder einen Logger benutzen.
Jetzt sieht man auch eine Exception:
Java:
java.io.NotSerializableException: AnmeldenRegistrieren
-> Auch AnmeldenRegistrieren muss Serializable implementieren.

2. Du hattest im Text angesprochen, dass du prüfen möchtest ob das Objekt in der Liste ist. Hier benutzt du vermutlich boolean contains(Object o); aus dem List Interface. Was macht contains? Das steht wunderbar im Javadoc:
Returns true if this list contains the specified element. More formally, returns true if and only if this list contains at least one element e such that (o==null ? e==null : o.equals(e)).
Es ruft also für jeden Benutzer equals auf. Wenn du equals nicht überschreibst wird die equals-Funktion aus Object verwendet, die Adressen vergleicht. Das wirst du nicht wollen, da gerade nach dem serialisieren und dann deserialisieren die Adresse verschieden sein wird. Deshalb musst du die equals überschreiben und selbst bestimmen, wann zwei Objekte gleich sind. Dabei musst du den equals-Contract einhalten.
Java:
@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Benutzer benutzer = (Benutzer) o;
    return Objects.equals(username, benutzer.username);
}
 

mortilus

Mitglied
Entschuldigung, aber ich bin wieder da, denn ich habe ein Problem bei der Anmeldung. Wenn ich mich registriere wird das Objekt richtig gespeichert. Aber ich mich anmelden muss, liest er den ArrayList wo alle User gespeichert sind, aber ich kann mich nur mit dem letzten User, der hinzugefügt wurde,anmelden. Das verstehe ich nicht! Entschuldigung, vielleicht ist was du mir vorher geschrieben hast, aber ich hab es einfach nicht ganz verstanden.
Java:
public class AnmeldenRegistrieren implements Serializable{
    private Benutzer user;
    private boolean zustand, zustand2;
    private ArrayList<Benutzer> usernameList = new ArrayList<>();
    //private static String adminPassword = "Hallo";
    //private static int pinAdmin = 1243;


    public void registrieren(Benutzer user){
        usernameList.add(user);
        System.out.println(user.getUsername());
        System.out.println(user.getPassword());
    }
    public boolean anmelden(String nickname, String password){
        for(Benutzer i: usernameList){
            if(i.getUsername().equals(nickname) && i.getPassword().equals(password)){
                zustand = true;
            }else if(i.getUsername().equals(nickname) && !i.getPassword().equals(password)){
                zustand = false;
            }else if(!i.getUsername().equals(nickname)){
                zustand = false;
            }
        }
        return zustand;
    }
    public boolean getZustand(){
        return zustand;
    }
    //public boolean getZustand2() { return zustand2;}

    public void getList(){
        for(Benutzer i: usernameList){
            System.out.println("Benutzername: "+i.getUsername());
            System.out.println("Password    : "+i.getPassword());
        }
    }
    /*public boolean adminAnmelden(Administrator admin){
        if(admin.getPasswordAdmin().equals(adminPassword)){
            zustand2 = true;
        }else{
            zustand2 = false;
        }
        return zustand2;
    }*/
}
Java:
public class Benutzer implements Serializable{
    private String username;
    private String password;

    public Benutzer(String username, String password){
        this.username = username;
        this.password = password;
    }

    public String getUsername(){
        return username;
    }
    public String getPassword(){
        return password;
    }
}
Java:
public class Main {
    public static void main(String[] args) {
        String benutzer, password;
        String adminPassword;
        int adminPin;

        int auswahl, x = 0, auswahl2, y = 0;

        Scanner input = new Scanner(System.in);
        AnmeldenRegistrieren anmregi = new AnmeldenRegistrieren();

        while(x != 1) {
        System.out.println("*    Anmelden als User   <1>    *");
        System.out.println("*    Anmelden als Admin  <2>    *");
        System.out.println("*         Registrieren   <3>    *");
        System.out.println("*            EXIT        <4>    *");
        auswahl = input.nextInt();

            switch(auswahl){
            case 1:
                    System.out.println("Enlesung vom gespeicherten Object");
                    try {
                        ObjectInputStream is = new ObjectInputStream(new FileInputStream("data.ser"));
                        anmregi = (AnmeldenRegistrieren) is.readObject();
                        anmregi.getList();
                        is.close();
                    } catch (FileNotFoundException e) {
                        System.out.println("Keine Accounts wurden hergestellt");
                        break;
                    } catch (IOException e){
                        System.out.println("Error");
                        break;
                    } catch (ClassNotFoundException e) {
                        e.printStackTrace();
                    }

                    System.out.println("Geben Sie den Benutzername ein!");
                    benutzer = input.next();
                    System.out.println("Passwort eingeben!");
                    password = input.next();
                    anmregi.anmelden(benutzer, password);
                    if(anmregi.getZustand() == true){
                        System.out.println("Erfolgreiche Anmeldung");
                        System.out.println();
                        y = 0;
                        while(y != 1) {
                            System.out.println("----------------------------");
                            System.out.println("| Angemeldet als: "+benutzer+" |");
                            System.out.println("----------------------------");
                            System.out.println();
                            System.out.println("*    Video hinzufuegen   <1>   *");
                            System.out.println("*      Video loeschen    <2>   *");
                            System.out.println("*           MENU         <3>   *");
                            auswahl2 = input.nextInt();

                            switch (auswahl2){
                                case 1:
                                    //video hinzufuegen kommt später
                                break;
                                case 2:
                                    //video loschen kommt später
                                break;
                                case 3:
                                    System.out.println();
                                    System.out.println();
                                    y = 1;
                                break;
                            }
                        }
                    }else{
                        System.out.println("Fehlgeschlagene Anmeldung");
                    }
                    break;
                case 2:
                    /*System.out.println("Geben Sie das Administrator Passwort ein");
                    adminPassword = input.next();
                    System.out.println("Geben Sie den PIN");
                    adminPin = input.nextInt();
                    Administrator admin = new Administrator(adminPassword, adminPin);
                    anmregi.adminAnmelden(admin);
                    if(anmregi.getZustand2() == true){
                        System.out.println("Success --> Anmeldung als Administrator");
                    }else{
                        System.out.println("Wrong!");
                    }
                    break;*/
                case 3:
                    System.out.println("Geben Sie den Nickname ein!");
                    benutzer = input.next();
                    System.out.println("Geben Sie das Passwort ein!");
                    password = input.next();
                    anmregi.registrieren(new Benutzer(benutzer, password));

                    // Objekt wird gespeichert // Problem beim speichern
                    try {
                        ObjectOutputStream ou = new ObjectOutputStream(new FileOutputStream("data.ser"));
                        ou.writeObject(anmregi);
                        ou.close();
                        System.out.println("Objeckt wurde gespeichert!");
                    } catch (FileNotFoundException e) {
                        System.out.println("Klasse wurde nicht gefunden!");
                    } catch (IOException e) {
                        System.out.println("Error");
                    }

                break;
                case 4:
                    x = 1;
                break;
            }
        }
    }
}
Ps. ich entschuldige mich für die kontinuierliche Fragen :(
 
Zuletzt bearbeitet von einem Moderator:

looparda

Top Contributor
Leider hast du den Vorschlag mit der Ausgabe der Exception nicht umgesetzt.
Deine Methode anmelden ist nicht richtig implementiert: Du iterierst über ALLE Benutzer, dabei überschreibst du den Zustand. Die Aussage von zustand ist nur für den letzten Benutzer, der geprüft wird richtig.
Du solltest dringend zustand und zustand2 in sinnvolle Variablennamen umbenennen.
 

looparda

Top Contributor
Die Variable zustand lässt sich ganz verwerfen, da sie sich aus den Informationen rekonstruieren lässt. Hier eine einfache Implementierung der Anmeldung:
Java:
public boolean anmelden(String nickname, String password) {
   boolean zugriff = false;
   for( Benutzer benutzer: usernameList ){
      // Benutzer anhand des Namen filtern
      if( !benutzer.getUsername().equals(nickname) ) {
         continue;
      }
      zugriff = benutzer.getPassword().equals(password);
   }
   return zugriff;
}
Wichtig ist, dass nur der Benutzer mit dem übergebenen namen auch geprüft wird. (Im Gegensatz zu deiner vorherigen Implementierung). Du kannst sobald der Benutzer geprüft wurde auch die Schleife verlassen. Hier gibt es viele Möglichkeiten und Geschmäcker dies richtig zu tun.
In deiner Main kannst du die Funktion dann benutzen:
Java:
 if( anmregi.anmelden(benutzer, password) ) {
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Java Applet Fragen: Serialisierung, Excel import Java Basics - Anfänger-Themen 2
V Java Serialisierung Java Basics - Anfänger-Themen 2
L Java Serialisierung Singleton Java Basics - Anfänger-Themen 6
D Problem mit der Serialisierung Java Basics - Anfänger-Themen 31
S Serialisierung: Laden von Objekten - Risiken? Java Basics - Anfänger-Themen 4
I Input/Output Alternative zur Serialisierung/ ImageJ Objecte Java Basics - Anfänger-Themen 7
W Nullpointer bei Objekt Serialisierung mit ArrayList<byte[]> etc. Java Basics - Anfänger-Themen 2
O Objekt Listen serialisierung und deserialisieren Java Basics - Anfänger-Themen 5
U Serialisierung Probleme bei Umsetzung Java Basics - Anfänger-Themen 26
V Serialisierung Umbennung einer Klasse Java Basics - Anfänger-Themen 2
G Input/Output Serialisierung oder Datenbank Java Basics - Anfänger-Themen 6
K Input/Output Serialisierung Java Basics - Anfänger-Themen 7
P Serialisierung - Objekte vergleichen Java Basics - Anfänger-Themen 4
J Input/Output Serialisierung Java Basics - Anfänger-Themen 6
K Serialisierung: speichern und auslesen, auslesen klappt nicht Java Basics - Anfänger-Themen 14
B Std-Serialisierung - Speichern/Laden geht nur auf einem Rechner Java Basics - Anfänger-Themen 17
W Problem mit Serialisierung von jTable Java Basics - Anfänger-Themen 15
E Serialisierung - Exception? Java Basics - Anfänger-Themen 21
T Collections (De)-Serialisierung meines HashSets Java Basics - Anfänger-Themen 3
J Input/Output Serialisierung Java Basics - Anfänger-Themen 6
W Problem mit Serialisierung und TableModel Java Basics - Anfänger-Themen 3
F Sonderzeichen bei XML Serialisierung nicht konvertieren Java Basics - Anfänger-Themen 7
O Serialisierung: Object abspeichern und aufrufen Java Basics - Anfänger-Themen 6
Luk10 Serialisierung bei schon vorhandener Datei Java Basics - Anfänger-Themen 15
I Serialisierung ClassNotFound Java Basics - Anfänger-Themen 8
S serialisierung Java Basics - Anfänger-Themen 3
E Alternativen zur binären Serialisierung ? Java Basics - Anfänger-Themen 9
J Serialisierung - Array-Objekt serialisieren/deserialisieren Java Basics - Anfänger-Themen 6
G Frage zu Serialisierung Java Basics - Anfänger-Themen 4
M Serialisierung erstes Beispiel Java Basics - Anfänger-Themen 4
A Per Serialisierung speichern Java Basics - Anfänger-Themen 2
DStrohma Problem mit Serialisierung Java Basics - Anfänger-Themen 3
T Threads und Serialisierung Java Basics - Anfänger-Themen 4
Z Serialisierung vs. Sicherheit Java Basics - Anfänger-Themen 2
R Serialisierung von Objekten Java Basics - Anfänger-Themen 12
S Serialisierung Java Basics - Anfänger-Themen 8
G Objekt Serialisierung Java Basics - Anfänger-Themen 3
P Serializable - Serialisierung Java Basics - Anfänger-Themen 5
P Collection Vector speichern mittels Serialisierung? Java Basics - Anfänger-Themen 2
H .java Dateien in Eclipse einbinden und ausführen Java Basics - Anfänger-Themen 1
onlyxlia Schlüsselworte Was meint man mit "einen Typ" in Java erstellen? Java Basics - Anfänger-Themen 2
O Java Kara geschweifte Klammern Java Basics - Anfänger-Themen 2
richis-fragen Mausrad logitech kann links und rechts klick wie in java abragen. Java Basics - Anfänger-Themen 15
XWing Java Klssenproblem Java Basics - Anfänger-Themen 4
R Umgebungsvariable java -cp gibt immer Java-Hilfe... Java Basics - Anfänger-Themen 3
farbenlos Csv Datei in Java einlesen Java Basics - Anfänger-Themen 18
F TableModelListener: java.lang.ArrayIndexOutOfBoundsException: 132 Java Basics - Anfänger-Themen 3
G Java 8 - Support-Ende Java Basics - Anfänger-Themen 7
T Java Weihnachtsbaum + Rahmen Java Basics - Anfänger-Themen 1
N Will mit Java anfangen Java Basics - Anfänger-Themen 13
Ü Java Array - Buchstaben als Zahlen ausgeben Java Basics - Anfänger-Themen 22
M Java Iterator Verständnisfrage Java Basics - Anfänger-Themen 6
M Java Mail Programm Java Basics - Anfänger-Themen 4
Sniper1000 Java 391 für Windows Java Basics - Anfänger-Themen 37
J Java long- in int-Variable umwandeln Java Basics - Anfänger-Themen 6
JaZuDemNo Java im Studium Java Basics - Anfänger-Themen 7
E Java Programm zur anzeige, ob Winter- oder Sommerzeit herrscht Java Basics - Anfänger-Themen 62
I QR code in Java selber generieren Java Basics - Anfänger-Themen 5
V Java-Ausnahmebehandlung: Behandlung geprüfter Ausnahmen Java Basics - Anfänger-Themen 1
krgewb Java Streams Java Basics - Anfänger-Themen 10
A Überwältigt von der komplexen Java Welt Java Basics - Anfänger-Themen 29
O Mehrfachvererbung auf Spezifikations- und Implementierungsebene in Java. Interfaces Java Basics - Anfänger-Themen 19
John_Sace Homogene Realisierung von Generics in Java ? Java Basics - Anfänger-Themen 19
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
R mit Java API arbeiten Java Basics - Anfänger-Themen 9
P JDK installieren Probleme bei der Java-Installation Java Basics - Anfänger-Themen 8
S Java: Wie sortiere ich eine ArrayList benutzerdefinierter Objekte nach einem bestimmten Attribut? Java Basics - Anfänger-Themen 2
Timo12345 JNLP File mit Java öffnen Java Basics - Anfänger-Themen 2
S Video Editierung mit Java.._ Java Basics - Anfänger-Themen 2
F Einstelungen in Java - CursorBlinkRate Java Basics - Anfänger-Themen 10
A PHP $_POST["name"] in Java Java Basics - Anfänger-Themen 3
vivansai21 Is there a oneliner to create a SortedSet filled with one or multiple elements in Java? Java Basics - Anfänger-Themen 9
Athro-Hiro Weißes Bild in Java erstellen Java Basics - Anfänger-Themen 3
Arjunreddy Can someone please tell me how to use a debugger in BlueJ(a Java environment) Java Basics - Anfänger-Themen 1
M Java assoziationen (UML) Java Basics - Anfänger-Themen 8
H Excel-Tabellen mit Java erstellen Java Basics - Anfänger-Themen 4
Simon16 Java ArrayListe von einer Klasse sortieren Java Basics - Anfänger-Themen 2
P Wie kann ich in meinem Java Programm etwas dauerhaft speichern? Java Basics - Anfänger-Themen 5
H Nutzt Eclipse alle CPU-Threads beim Ausführen von Java-Programmen? Java Basics - Anfänger-Themen 4
xXGrowGuruXx Java einstieg, leichte sache 0 verstanden Java Basics - Anfänger-Themen 7
A java.sql.SQLException: Data type mismatch. Java Basics - Anfänger-Themen 1
H Java-Programm zur Ausgabe von Zuständen Java Basics - Anfänger-Themen 80
N Java Spiel Figur auf dem Hintergrundbild bewegen. Java Basics - Anfänger-Themen 11
G Kann Java-Programm nicht als jar aufrufen, auch als EXE nicht Java Basics - Anfänger-Themen 19
N Java Taschenrechner hat Jemand vlt einen Tipp dafür wie ich jetzt die buttons verbinden kann und das Ergebnis auf dem textfield anzeigen lassen kann Java Basics - Anfänger-Themen 13
A Lerngruppe Java Java Basics - Anfänger-Themen 2
G Help me in the Java Program Java Basics - Anfänger-Themen 2
L Java- Vererbung Java Basics - Anfänger-Themen 4
LimDul Suche Java Stream Tutorial Java Basics - Anfänger-Themen 2
_so_far_away_ Ich möchte Java lernen Java Basics - Anfänger-Themen 11
benny1993 Java Programm erstellen für ein Fußball-Turnier Java Basics - Anfänger-Themen 3
M Datentypen While-Schleife eine Java Methode erstellen Java Basics - Anfänger-Themen 3
V Bild per Java Script austauschen Java Basics - Anfänger-Themen 7
MoxMorris this Keyword in Java Java Basics - Anfänger-Themen 14
D Wie kann man in Java nach Arrays auf Duplikate prüfen Java Basics - Anfänger-Themen 12
wolei JAVA Zeitdifferenz feststellen. Java Basics - Anfänger-Themen 4
DiyarcanZeren Rekursion in Java Java Basics - Anfänger-Themen 5
wolei Java generic interface in a generic class Java Basics - Anfänger-Themen 6
monsterherz Ablauf der Erstellung eines Java Programmes Java Basics - Anfänger-Themen 17
monsterherz Circle.java:5: error: <identifier> expected Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben