Eine Arrayliste in XML abspeichern und laden können

Renas

Mitglied
Moin, bin neu hier und totaler Anfänger. Ich bitte um Hilfe.
Ich versuche mich schon seit Tagen an einem kleinen selbstgeschriebenen Programm und komme einfach nicht weiter. In meinem Programm erstelle ich eine ArrayListe, die funktioniert so weit. Ich kann aus dieser erstellte Objekte(nennt man die so?) einer anderen Klasse mit verschiedenen Attributen wie Name Telefonnummer usw tabellarisch ausgeben. Funktioniert alles top, bis auf das abspeichern und laden von einer XML-Datei. Dazu verwende ich folgenden Code:

zum laden diese zwei --
Java:
private void load() {
  try {
    TestProgramm neu = (TestProgramm) loadDataFromXML();
  } catch(java.io.IOException ioe){
    ioe.printStackTrace();
  }
}

public Object loadDataFromXML() throws IOException {
  XMLDecoder o = new XMLDecoder(newFileInputStream("TestProgramm.xml"));
  o.readObject();
  Object obj =o.readObject();
  o.close();
  return obj;
}
und zum speichern diese zwei --
Java:
public void save() {
  try{
    saveDataToXML();
  }catch(java.io.IOException ioe){
    ioe.printStackTrace();
  }
}

public void saveDataToXML() throws IOException {
  XMLEncoder o = new XMLEncoder(new FileOutputStream("TestProgramm.xml"));
  o.writeObject("TestProgramm");
  o.writeObject(this);
  o.close();
}
Beide Methoden funkionieren in einem anderen Programm meines Professors tadellos und werden auch in meinem fehlerlos ausgeführt. Die XML-Datei wird auch erstellt und beim laden wird auch kein Fehler angezeigt. Jedoch wenn ich die Tabelle ausgebe, dann ist sie leer. Die erstellten Objekte mit entsprechenden Namen und sonstigen Daten sind nicht da, einfach leer.
Wo vermutet lässt sich das Problem vermuten?
 
Zuletzt bearbeitet von einem Moderator:
Okay, Danke für die Antwort, aber was soll ich darunter verstehen und wie lässt sich das Problem beheben? Der Code ist übrigens eins zu ein kopiert und beim anderen Programm tritt dieser Fehler nicht auf. Spricht das nicht eher dafür das die Fehlerursache ausserhalb des Codes oben zu suchen ist?
 
Schau Dir Deine Funktion load an. In der Funktion erstellst Du eine lokale Variable in der Du eine neue Instanz (geladen aus der Datei) speicherst.

Dann endet die Funktion, die lokale Variable verliert die Gültigkeit und die geladenen Daten sind für dich weg.

Also scheint doch irgend etwas anders zu sein ...
 
Formatiere bitte deinen Code ordentlich und setze ihn auch in Code-Tags mit: [code=java]//JAVA CODE HERE[/code]
 
Funktionier leider immer noch nicht, auch nicht wenn ich die neue Instanz entferne. Die Codes zum speichern und laden sind aber ohnehin identisch, habe nochmal nachgeprüft.

Es scheint das es ein Problem beim Abspeichern gibt. Die XML-Datei wird zwar angelegt, aber die Parameter und ihre Werte werden darin nicht eingetragen. Wenn ich die Datei mit dem Editor öffne, dann ist sie fast leer. Die ArrayListe ist darin eingetragen, aber die Objekte mit ihren Parameter und Werten fehlen. Wenn ich in die XML vom anderen Programm einsehe, dann sieht das anders aus. Nach der Liste folgen sowohl Parameter wie auch ihre jeweiligen Werte.

Woran kann das liegen?
 
Also poste mal deinen ganzen code. Vermutlich rufst du das speichern auf einer falschen Instanz auf oder so. Kannst auch gerne den funktionierenden Code zusätzlich posten wenn Du die Unterschiede nicht siehst.
 
Oje, sind nicht gerade wenige Zeilen. Aber okay. Also das ist nur ein TestProgramm ohne Sinn und Logik, es geht mir nur darum die Anwendung von Java und die Befehle zu erlernen.

Hauptklasse

Java:
package testprogramm;

import java.beans.*;  // fuer die XML-Speicherung
import java.io.*;  // fuer das Speichern und Laden in / von Dateien
import java.util.*;  // fuer ArrayLists und Iterator


public class TestProgramm implements Serializable{

private String logInkontonummer;

private ArrayList<Konto> kontenliste;

private String einlesen;
private String einlesen2;

final static int FELDLAENGE = 14;

Scanner scanner = new Scanner(System.in);


private final static String ENDE = "0";

private final static String KONTOANLEGEN = "1";
private final static String KONTOSTANDPRUEF = "2";
private final static String KONTENANZEIGEN = "3";
private final static String SPEICHERN = "4";
private final static String LADEN = "5";


private final static String GUTHABENANZEIGEN = "1";
private final static String ÜBERWEISUNG = "2";
private final static String AUSLOGGEN = "3";   

   

public TestProgramm(){

this.kontenliste = new ArrayList<>();

}


public static void main(String[] args) throws IOException{
TestProgramm tp = new TestProgramm();
tp.load();
}


public void einlesen(){
System.out.print("Eingabe: ");
einlesen = scanner.next();
}

public void einlesen2(){
System.out.print("Eingabe: ");
einlesen2 = scanner.next();
}


public void menueEinlesen(){
einlesen();

switch (einlesen){
case KONTOANLEGEN: einlesen = null; kontoEinrichten(); break;
case KONTOSTANDPRUEF: einlesen = null; logIn(); break;   
case KONTENANZEIGEN: einlesen = null; kontenAnzeigen(); menueAufbau(); break;   
case LADEN: einlesen = null; load(); break;
case SPEICHERN: einlesen = null; save(); System.out.println("\n** Daten wurden gesichert **\n"); menueAufbau(); break;
case ENDE: einlesen = null; Ende(); break;
default: einlesen = null; System.out.println("Falsche Eingabe"); menueAufbau();

}
}

public void printLinksbuendig(String s)
{
System.out.print(baueLinksbuendigenString(s, FELDLAENGE));
}

public void printLF()
{
System.out.println();
}

public void printLinieLF(int anzahlFelder)
{
/* Besonderheit: hier Nutzung des StringBuilders statt direkt mit String zu arbeiten.
* Ist sparsamer im Umgang mit Speicher.
*/
StringBuilder s = new StringBuilder();
int laenge = anzahlFelder*(FELDLAENGE+3);
for (int i=1;i<=laenge;i++)
{
s=s.append("-");
}
System.out.println(s);
}

public String castInt2String(int meinInt)
{
return Integer.toString(meinInt);
// die obige Zeile ist von der Funktion identisch zu
// Integer i = new Integer(meinInt);
// return i.toString();
}

public String castDouble2String(double meinDouble)
{
// hier nutzen wir die Format-Anweisung der Klasse String um die Nachkommastellen zu bestimmen etc.
return String.format("%,8.2f", meinDouble);
}

public void kontenAnzeigen(){
printLF();
String s;

printLinksbuendig("Konto-ID");
printLinksbuendig("Vorname");
printLinksbuendig("Nachname");
printLinksbuendig("Guthaben");
printLinksbuendig("Kontonummer");

printLF();
printLinieLF(5); // Trennlinie für 6 Felder anzeigen

Iterator <Konto>iter = kontenliste.iterator();
while(iter.hasNext()){

Konto i  =  iter.next();
s = castInt2String(i.getKontoID());
printLinksbuendig(s+".");

s = i.getVorname();
printLinksbuendig(s);

s = i.getNachname();
printLinksbuendig(s);

s = castDouble2String(i.getStartguthaben());
printLinksbuendig(s+" €");

s = castInt2String(i.getKontonummer());
printLinksbuendig(s);

printLF();



}

printLF();

}   

public void menueAufbau(){
System.out.println(" ______________________________________________");
System.out.println("|***************** Hauptmenü ******************|");
System.out.println("|______________________________________________|");
System.out.println("||  Ihre Optionen  ||");
System.out.println("------------------------------------------------");
System.out.println("Optionen:\n1 - Konto anlegen\n2 - Einloggen\n3 - Konten anzeigen\n4 - Speichern in eine XML-Datei\n5 - Laden von einer XML-Datei \n0 - Beenden");
menueEinlesen();

}


public void kontoEinrichten(){
int kontoID = neuKontoID();
String vorname = neuVorname();
String nachname = neuNachname();
String kontonummer = neuKontonummer();
String passwort = neuPasswort();
String startguthaben = neuStartguthaben();

Konto konto = new Konto(kontoID, nachname, vorname, Integer.valueOf(kontonummer), passwort, Double.valueOf(startguthaben));
kontenliste.add(konto);
System.out.println("Ihr Konto wurde eingerichtet.\nIhre KontoID lautet: " + kontoID);

menueAufbau();

}

public String neuStartguthaben(){
String startguthaben;
  do{
System.out.print("Wieviel Startguthaben wollen sie einzahlen: ");   
startguthaben = scanner.next();
} while(!startguthaben.matches("[0-9]+"));  
return startguthaben;
}   

public String neuPasswort(){
  String passwort;
System.out.print("Wählen sie ein Passwort: ");   
passwort = scanner.next();
return passwort;
}

public String neuNachname(){
  String nachname;
do{
System.out.print("Geben sie Ihren Nachnamen ein: ");   
nachname = scanner.next();
} while (!nachname.matches("[a-zA-Z]+"));
return nachname;
}

public String neuVorname(){
  String vorname;
do{
System.out.print("Geben sie Ihren Vornamen ein: ");   
vorname = scanner.next();
} while (!vorname.matches("[a-zA-Z]+"));
return vorname;
}

public String neuKontonummer(){
String kontonummer="";
try{
do{
System.out.print("Wählen sie eine 6-stellige Kontoummer: ");
kontonummer = scanner.next();
}  while(!String.valueOf(kontonummer).matches("[1-9][0-9]{5}"));
for(int i = 0; i<kontenliste.size() ;i++){
if(kontenliste.get(i).getKontonummer() == (Integer.valueOf(kontonummer))){
System.out.println("Die Kontonummer '"+kontonummer+"' ist vergeben"); kontonummer = neuKontonummer();
} }   
} catch(NumberFormatException nf) {neuKontonummer();
} return kontonummer;
}




public int neuKontoID(){
  int kontoID=0;
for(int i = 0; i < kontenliste.size()+1; i++){
for(int t=0; t < kontenliste.size(); t++ ){ if(kontenliste.get(t).getKontoID()!=i){ kontoID =i; }
}
}  return kontoID;   
}   

public void sortKontoID() {
Konto h;
for (int i = 0; i < kontenliste.size() - 1; i++) {
for (int j = i + 1; j < kontenliste.size(); j++) {

if (kontenliste.get(i).getKontoID() > kontenliste.get(j).getKontoID()) {
h = kontenliste.get(j);
kontenliste.set(j, kontenliste.get(i));
kontenliste.set(i, h);
}
}
}
}


public void guthabenZeigen(){
   
for(int i = 0; i<kontenliste.size(); i++){   
if(kontenliste.get(i).getKontonummer()==(Integer.valueOf(logInkontonummer))){   
System.out.println("\nIhr Guthaben beträgt: "+kontenliste.get(i).getStartguthaben()+" €"); logInMenue();
}
}
}




public void saveDataToXML() throws IOException {
XMLEncoder o = new XMLEncoder(new FileOutputStream("TestProgramm.xml"));
o.writeObject("TestProgramm");
o.writeObject(this);
o.close();
}

public void save() {
try
{
saveDataToXML();

}
catch(java.io.IOException ioe)
{
ioe.printStackTrace();
}
}

public Object loadDataFromXML() throws IOException {
XMLDecoder o = new XMLDecoder(new FileInputStream("TestProgramm.xml"));
o.readObject();
Object obj = o.readObject();
o.close();
return obj;

}

private void load() {

try {

TestProgramm neu = (TestProgramm) loadDataFromXML();
System.out.println("\n** Daten wurden geladen **\n");
menueAufbau();

} catch(java.io.IOException ioe)
{
ioe.printStackTrace();
}

}



public void Ende(){   
do{
System.out.println("Wollen sie ihre Daten vorher sichern? (ja/nein)");
einlesen = scanner.next();
if(einlesen.toLowerCase().equals("ja".toLowerCase())){save(); System.out.println("Daten wurden gesichert. Programm wird beendet"); einlesen = null; System.exit(0);}
else if (einlesen.toLowerCase().equals("nein".toLowerCase())){System.out.println("Programm wird beendet"); einlesen = null; System.exit(0);}
}while(!einlesen.toLowerCase().matches("ja") || !einlesen.toLowerCase().matches("nein"));
}




public String baueLinksbuendigenString(String s, int laenge)
{
// wir entfernen Leerzeichen am Anfang und Ende des Strings
s.trim();
// falls der String zu lang ist, kuerzen wir ihn
if (s.length() > laenge)
{
s.substring(0, laenge);
}
else
{
int differenz = (laenge - s.length());
for (int i=1;i<=differenz;i++) s=s+" ";
}

return s+" | ";
}

public ArrayList getKontenliste()
{  
  return this.kontenliste;
}

public void setKontenliste(ArrayList<Konto> liste)
{
this.kontenliste = liste;
}

private void logIn(){
   
  do{
  System.out.print("Geben sie ihre Kontonummer ein: ");
  einlesen(); } while(!einlesen.matches("[1-9][0-9]{5}"));
  for(int i=0 ; i<kontenliste.size(); i++){
  if (kontenliste.get(i).getKontonummer()==(Integer.valueOf(einlesen))){
  System.out.print("Geben sie ihr Passwort ein: ");
  einlesen2();
  if(kontenliste.get(i).getPasswort().equals(einlesen2)){
  this.logInkontonummer=einlesen;
  einlesen = null;
  einlesen2 = null;
  logInMenue();
  }
  System.out.println("Passwort ist falsch"); einlesen = null; einlesen2 = null; menueAufbau();
  }
  } System.out.println("Ein Konto mit der Kontonummer: "+ einlesen +" existiert nicht."); einlesen = null; menueAufbau();
   
   
}

private void logInMenue(){
  for(int i = 0 ; i< kontenliste.size(); i++){
  if(kontenliste.get(i).getKontonummer()==Integer.valueOf(logInkontonummer))
  {
   
   
  System.out.println("_______________________________________________________________");
  System.out.println("***** Kontoinhaber: "+ kontenliste.get(i).getVorname() +" "+ kontenliste.get(i).getNachname() +" ist eingeloggt *****");
  }}
  System.out.println("_______________________________________________________________");
  System.out.println("\nIhnen stehen folgende Anwendungen zur Auswahl\n1. Guthaben anzeigen\n2. Überweisung tätigen\n3. Ausloggen\n0. Programm beenden\n");
   
  einlesen();
   
  switch (einlesen) {
  case GUTHABENANZEIGEN: einlesen = null; guthabenZeigen(); break;
  case ÜBERWEISUNG: einlesen = null; break;
  case AUSLOGGEN: einlesen = null; ausloggen(); break;
  case ENDE: einlesen = null; Ende(); break;   
  default: einlesen = null; System.out.println("Falsche Eingabe"); logInMenue();
  }
   
}

private void ausloggen(){
   
  do{ System.out.println("Wollen sie sich wirklich ausloggen (ja/nein)?");
  System.out.print("Eingabe: ");
  einlesen = scanner.next();
  if(einlesen.toLowerCase().matches("ja".toLowerCase())){
  this.logInkontonummer = null;
  einlesen=null;
  menueAufbau();
  } else if(einlesen.toLowerCase().matches("nein".toLowerCase())){
  einlesen = null;
  logInMenue();
  }
   
  } while(!einlesen.toLowerCase().matches("nein") || !einlesen.toLowerCase().matches("ja"));
   
}

}

Unterklasse

Java:
package testprogramm;

public class Konto {
  private int kontoID;
  private String nachname;
  private String vorname;
  private int kontonummer;
  private String passwort;
  private double startguthaben;   



   
public Konto(){
   
}   
   
public Konto(int kontoID, String nachname, String vorname, int kontonummer, String passwort, double startguthaben){
   
  this.kontoID = kontoID;
  this.nachname = nachname;
  this.vorname = vorname;
  this.kontonummer = kontonummer;
  this.passwort = passwort;
  this.startguthaben = startguthaben;
   
}   

public int getKontonummer(){
   
  return kontonummer;
}

public void setKontonummer(){
  this.kontonummer = kontonummer;
}

public String getPasswort(){
  return passwort;
}

public void setPasswort(){
  this.passwort = passwort;
}


public int getKontoID(){
  return kontoID;
}

public void setKontoID(){
  this.kontoID = kontoID;
}
public String getVorname(){
  return vorname;   
}

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

public String getNachname(){
  return nachname;   
}

public void setNachname(){
  this.nachname = nachname;
}

public double getStartguthaben(){
  return startguthaben;   
}

public void setStartguthaben(){
  this.startguthaben = startguthaben;
}

}
 

Neue Themen


Zurück
Oben