Deserialisierung im Konstruktor

Mircot

Mitglied
Hallo liebe Gemeinde...

habe da mal ein kleines Problem im C#.

Ich habe beispielsweise eine Klasse:

Code:
  public class SystemVariablen
  {
  		public string DBOrt, Name, Passwort;
  }

Diese Klasse will ich Serialisieren, was an sich keine Probleme macht. Womit ich aber Probleme habe ist die Idee, diese Klasse gleich mit Hilfe des Konsturktors zu deserialisieren.

Habe aus dem C# Buch vom Herdt Verlag das beispiel genommen:

Code:
  		public object Laden(string Datei)
  		{
  			object Objekt;
  			Datei = Application.StartupPath.ToString() + "\\" + Datei;
  			FileStream fs = new FileStream(Datei, FileMode.Open);
  			BinaryFormatter bf = new BinaryFormatter();
  			Objekt=bf.Deserialize(fs);
  			fs.Close();
  			return Objekt;
  		}

und etwas umgeschieben. Die Funktion gibt als Rückgabewert das Objekt zurück, was ich deserialisiere. Dieses Muss ich dann nur noch Zuweisen:

Code:
  SystemVariablen SysVar = new Laden("datei.sys");

Mein Ziel ist es, dass dieses auch gleich automatisch über den Konstruktor der Klasse gelöst wird. Dass ich nur noch:

Code:
  SystemVariablen SysVar = new SystemVariablen();

eingeben muss, und die Klasse ist mit den Daten gefüllt, mit denen sie serialisiert wurde.

Dann noch eine Funktion der Klasse zugebastelt zum Serialisieren.


Hat Jemand eine Idee Oder einen anderen Weg

Mfg Mirco
 
In den Konstruktor gehört zwar normalerweise nichts was eine Exception auslösen kann, aber gut, in manchen Fällen geht es nicht anders.

Womit hast du denn dein Problem jetzt genau? Denn wenn das Deserialisieren funktioniert, sollte es egal sein, an welcher Stelle du das aufrufst. Ich hoff nur dass du den Code nicht wirklich aus einem Buch hast, denn dann solltest das Buch verbrennen und dir ein anderes kaufen:

Code:
public SystemVariablen Laden(string Datei)
{
	SystemVariablen var;
	Datei = Application.StartupPath + "\\" + Datei;
	FileStream fs = new FileStream(Datei, FileMode.Open);
	BinaryFormatter bf = new BinaryFormatter();
	var = (SystemVariablen)bf.Deserialize(fs);
	fs.Close();
	return var;
}

Mit Konstruktor meinst du vermutlich den Konstruktor deiner Form:
Hier halt dann einfach
Code:
  mySysVars = Laden("sysvars.xml");
Wobei du natürlich vorher mySysVars als private Member deklarieren musst:
Code:
SystemVariablen mySysVars = null;
Vielleicht solltest auch darauf achten, in Zukunft deine Variablen und Funktionen Englisch zu halten, sowie ein wenig auf Coding-Styles zu achten. Macht alles ein wenig leichter und einfacher zu lesen.
 
Du meinst ich sollte über den Konstruktor der Form einfach die Klasse deserialisieren, ist natürlich auch eine Idee, probier ich dann mal aus.
 
Ich wollte die Deserialisierung gleich mit im Konstruktor der Klasse selber unterbringen.

Code:
 public class Test
 {
 
 public string Teststring;
 
 private void Test()
 {
   
   Deserialisieren der Klasse und Zuweisen des Teststrings
      
 }
  
 }

So in der Art, dass ich beim Instanzieren eines Objektes der Klasse gleich die Werte habe.

Vielleich denke ich auch falsch...
 
Ah so meinst das, ein Objekt, das sich selbst befüllt.

Ja auch kein Problem. dann solltest es aber mit seinem Klassennamen instanzieren und nicht mit object weil der Konstruktor ja nie aufgerufen wird.
Mach es einfach so:
Code:
public class SystemVariablen
{
  private string dBOrt;
  private string name;
  private string passwort;
  private string path;

public string DBOrt
{
     get { return this.dBOrt; }
     set { this.dBOrt = value; }
}

public string Name
{
     get { return this.name; }
     set { this.name = value; }
}

public string Passwort
{
     get { return this.passwort; }
     set { this.passwort = value; }
}

public string Path
{
     get { return this.path; }
     set { this.path = value; }
}

public SystemVariablen() {}

public void Init() {
  Hier deserialisieren und die Properties auffüllen.
}
}

Warum so? Nun, es ist für den Programmierer (dich, oder vielleicht auch einem anderen) einfacher, wenn er ohne jetzt die Klasse im Sourcecode zu kennen, weiß was passiert. Machst du das Einlesen im Konstruktor weiß er das nicht. Mittles Init() weiß er dass das Objekt initialisiert wird.
 
Ich fitz mich mal durch und probier es mal aus!!

Danke, wenn es probleme gibt, melde ich mch nochmal!!
 
Zuletzt bearbeitet:
:suspekt: Ich bekomm die Schwämmchen...


Habe gerade einen Mircot.System.BlackOut()....

Kannst Du mir mal bitte ein Beispiel für die Betreffende Deserialisierung geben, ich weis nicht wie ich die Werte Zuweisen muss.....

Danke
 
Code:
SystemVariablen var;
Datei = Application.StartupPath + "\\" + Datei;
FileStream fs = new FileStream(Datei, FileMode.Open);
BinaryFormatter bf = new BinaryFormatter();
var = (SystemVariablen)bf.Deserialize(fs);
fs.Close();

this.DbOrt = var.DbOrt;
...
 
OK,
ich habe jetzt folgende Klasse zusammengeschaubt. aber irgendwass geht net. Ich muss jetzt auch erstmal weg.

Kann sich ja jemand den Code mal anschauen. Ich habe das Problem das beim Instandzieren des Objekten die Variablen nicht initialisiert werden. Die klasse soll, wenn die Datei zum deserialisieren nicht da ist, die Variablen Leer übergeben.

Code:
  	[Serializable()]
  	public class SysVar
  	{
  		private string dBOrt;
  		private string dBPasswort;
  		private string dBName;
  		private string lizenzName;
  		private string lizenzNummer;
  		
  		public string DBOrt
  		{
  			get{ return this.dBOrt;}
  			set{ this.dBOrt=value;}
  		}
  		public string DBName
  		{
  			get{ return this.dBName;}
  			set{ this.dBName=value;}
  		}
  		public string DBPasswort
  		{
  			get{ return this.dBPasswort;}
  			set{ this.dBPasswort=value;}
  		}
  		public string LizenzName
  		{
  			get{ return this.lizenzName;}
  			set{ this.lizenzName=value;}
  		}
  		public string LizenzNummer
  		{
  			get{ return this.lizenzNummer;}
  			set{ this.lizenzNummer=value;}
  		}
  
  		public SysVar() {} // Konstruktor
  
  		public void Init()
  		{
  			try
  			{
  				SysVar MySysVar;
 		 	string Datei = Application.StartupPath.ToString() + "\\wkv.sys";
 		 	FileStream fs = new FileStream(Datei, FileMode.Open);
 				BinaryFormatter bf = new BinaryFormatter();
 				MySysVar=bf.Deserialize(fs) as SysVar;
  				fs.Close();
  				this.dBOrt = MySysVar.dBOrt;
  				this.dBName = MySysVar.dBName;
 				this.dBPasswort = MySysVar.dBPasswort;
 				this.lizenzName=MySysVar.lizenzName;
 				this.lizenzNummer= MySysVar.lizenzNummer;
  			}
  			catch
  			{
 		 	this.dBOrt = Application.StartupPath.ToString() + "\\test.mdb";
  				this.dBName = "";
  				this.dBPasswort = "";
  				this.lizenzName="";
  				this.lizenzNummer="";
  			}
  
  		}
  	}

bis später......
 
Zurück