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
 

Norbert Eder

Erfahrenes Mitglied
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.
 

Mircot

Mitglied
Du meinst ich sollte über den Konstruktor der Form einfach die Klasse deserialisieren, ist natürlich auch eine Idee, probier ich dann mal aus.
 

Mircot

Mitglied
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...
 

Norbert Eder

Erfahrenes Mitglied
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.
 

Mircot

Mitglied
Ich fitz mich mal durch und probier es mal aus!!

Danke, wenn es probleme gibt, melde ich mch nochmal!!
 
Zuletzt bearbeitet:

Mircot

Mitglied
: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
 

Norbert Eder

Erfahrenes Mitglied
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;
...
 

Mircot

Mitglied
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......
 

Norbert Eder

Erfahrenes Mitglied
1. Application.Startup... wird nicht funktionieren. Du musst den Pfad an die Klasse übergeben. Hatte ich eigentlich auch drinnen, wurde von dir nicht übernommen -> Path. Deine Klasse kennt Application ja nicht.

2. Wenn du das so willst, dann musst du eben abfragen ob Werte etc. vorhanden sind, oder nicht. Das sollte nicht so schwer sein.
 

Christian Kusmanow

Erfahrenes Mitglied
Hallo Reverent!

Schonmal MrGoogle gefragt? :rolleyes: ;-]
Im Gallileo OpenBook steht zB was dazu.
Und 'nen netten Thread gibts dazu auch. ;)
[thread=199855]Struktur in Datei speichern - Thread[/thread]

MfG, cosmo
 

Mircot

Mitglied
Wenn ich ehrlich bin erschien mir dieser Teil als normale Variable wie DBName usw..

Wieso ist path so wichtig?


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

Mircot

Mitglied
Ich glaube ich habe es, kann das sein das wir im Konstruktor noch die Funtion init() aufrufen müssen
 

Norbert Eder

Erfahrenes Mitglied
Ja. Wirst du natürlich wissen.

Und das mit dem Pfad hast du nicht ganz verstanden, glaub ich. Application.StartupPath wird in einer Klasse nicht funktionieren. Deshalb solltest den Pfad zu deinem Config-File übergeben.
 

Mircot

Mitglied
Ich habe es gerade ausprobiert, Application.StartupPath funktioniert in der Klasse.


Scheint erstmal zu gehen ;-), DANKE
 

Neue Beiträge