Deserialisieren auf sich selbst

Status
Nicht offen für weitere Antworten.

sTaX

Mitglied
Hi,
ich habe eine Config-Klasse wo verschiedene Daten z.B. mysql-Datenbank usw. gespeichert sind.

Die Klasse besitzt eine Methode (save) welche sich selbst in eine Datei serialisiert.
Das funktioniert auch gut. Jedoch funktioniert das Laden (deserialisieren) nicht so wie ich möchte.

Ich habe dazu eine weitere Methode (load) geschrieben. Dort lese ich das Object ein und speicher es in einem objekt welches auf "this" verweist. Jedoch klappt es nur so halb.

Hier meine Config.java:
Ganz unten sind die Methoden zum (de)serialisieren.
Beim beim laden gibt er mir "nichts" aus.
Java:
package util;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class Config implements Serializable  {
	private static final long serialVersionUID = 1L;
	public String mysqlHost = "";
	public String mysqlUser = "";
	public String mysqlPassword = "";
	public String mysqlDatabase = "";
	public String ftpHost = "";
	public String ftpUser = "";
	public String ftpPassword = "";
	public static final String configFilename = System.getProperty("user.home")+"/config.conf";
	
	public String getMysqlHost() {
		return mysqlHost;
	}
	public void setMysqlHost(String mysqlHost) {
		this.mysqlHost = mysqlHost;
	}
	public String getMysqlUser() {
		return mysqlUser;
	}
	public void setMysqlUser(String mysqlUser) {
		this.mysqlUser = mysqlUser;
	}
	public String getMysqlPassword() {
		return mysqlPassword;
	}
	public void setMysqlPassword(String mysqlPassword) {
		this.mysqlPassword = mysqlPassword;
	}
	public String getMysqlDatabase() {
		return mysqlDatabase;
	}
	public void setMysqlDatabase(String mysqlDatabase) {
		this.mysqlDatabase = mysqlDatabase;
	}
	public String getFtpHost() {
		return ftpHost;
	}
	public void setFtpHost(String ftpHost) {
		this.ftpHost = ftpHost;
	}
	public String getFtpUser() {
		return ftpUser;
	}
	public void setFtpUser(String ftpUser) {
		this.ftpUser = ftpUser;
	}
	public String getFtpPassword() {
		return ftpPassword;
	}
	public void setFtpPassword(String ftpPassword) {
		this.ftpPassword = ftpPassword;
	}
	/**
	 * Speichert die Konfiguration in einer Datei
	 */
	public void save() {
		ObjectOutputStream oos;
		try {
			oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(configFilename)));
			oos.writeObject(this);
			oos.flush();
			oos.close();	
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}
	
	public void load() {
		Config conf = this;
		ObjectInputStream objIn;
		try {
			objIn = new ObjectInputStream(new BufferedInputStream(new FileInputStream(configFilename)));
			conf = (Config) objIn.readObject( );
			objIn.close();
			System.out.println("mysqlHost:"+getMysqlHost());
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}

	}
	
	
}

Wenn ich die load-Methode so verändere gibt er mir das richtige aus:
Java:
public void load() {
		Config conf = this;
		ObjectInputStream objIn;
		try {
			objIn = new ObjectInputStream(new BufferedInputStream(new FileInputStream(configFilename)));
			conf = (Config) objIn.readObject( );
			objIn.close();
			this.setMysqlHost(conf.getMysqlHost());
			System.out.println("mysqlHost:"+getMysqlHost());
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}

	}
Ist da irgendwo ein (Denk)-Fehler von mir drin. Oder geht es einfach nicht?
 
nun ja, das obige ist falsch und das untere korrekt,
was kann man mehr sagen?

beim obigen lädst du ein conf-Objekt, aber das ist ein anderes als das eigene,
ein Objekt verändert nicht gleichzeitig alle andere derselben Klasse


ach, lass bloß nicht all die getter und setter manche hier im Forum sehen 😉
 
ach, lass bloß nicht all die getter und setter manche hier im Forum sehen 😉
...äh, genau! Verbesser die Modifier der Instanzvariablen besser gleich in "private" 🙂
Ausserdem würde ich das Serialisieren bei derartigen Klassen ruhig selber implementieren. Das bedeutet:
Java:
private void read(ObjectInputStream in)
throws ClassNotFoundException, IOException
{
  mysqlHost = in.readUTF();
  mysqlUser = in.readUTF();
  mysqlPassword = in.readUTF();
  mysqlDatabase = in.readUTF();
  ftpHost = in.readUTF();
  ftpUser = in.readUTF();
  ftpPassword = in.readUTF();
}

private void write(ObjectOutputStream out)
throws IOException
{
  out.writeUTF(mysqlHost);
  out.writeUTF(mysqlUser);
  out.writeUTF(mysqlPassword);
  out.writeUTF(mysqlDatabase);
  out.writeUTF(ftpHost);
  out.writeUTF(ftpUser);
  out.writeUTF(ftpPassword);
}

public boolean save()
{
  try {
    ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(configFilename));
//  write(new ObjectOutputStream(new FileOutputStream(configFilename))); SO NICHT!!!
    write(out);
    out.close();
    return true;
  } catch(IOException e) {
    // vllt. noch enforced close noetig
    return false;
  }

public boolean load()
{
  try {
    ObjectInputStream in = new ObjectInputStream(new FileInputStream(configFilename));
    read(in);
    in.close();
    return true;
  } catch(IOException e) {
    // vllt. noch enforced close noetig
    return false;
  }
}
 
Zuletzt bearbeitet von einem Moderator:
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben