tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
JA
ANTWORTEN
16
ZUGRIFFE
890
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von Mircot
    Mircot Mircot ist offline Mitglied Bronze
    Registriert seit
    Mar 2005
    Beiträge
    36
    Hallo liebe Gemeinde...

    habe da mal ein kleines Problem im C#.

    Ich habe beispielsweise eine Klasse:

    Code :
    1
    2
    3
    4
    
      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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
            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 :
    1
    
      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 :
    1
    
      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
     

  2. #2
    Avatar von Norbert Eder
    Norbert Eder Norbert Eder ist offline Mitglied Diamant
    Registriert seit
    Feb 2004
    Ort
    Österreich / Graz
    Beiträge
    5.137
    Blog-Einträge
    51
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    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 :
    1
    
      mySysVars = Laden("sysvars.xml");
    Wobei du natürlich vorher mySysVars als private Member deklarieren musst:
    Code :
    1
    
    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.
     

  3. #3
    Avatar von Mircot
    Mircot Mircot ist offline Mitglied Bronze
    Registriert seit
    Mar 2005
    Beiträge
    36
    Du meinst ich sollte über den Konstruktor der Form einfach die Klasse deserialisieren, ist natürlich auch eine Idee, probier ich dann mal aus.
     

  4. #4
    Avatar von Norbert Eder
    Norbert Eder Norbert Eder ist offline Mitglied Diamant
    Registriert seit
    Feb 2004
    Ort
    Österreich / Graz
    Beiträge
    5.137
    Blog-Einträge
    51
    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.
    Was hast du sonst damit gemeint?
     

  5. #5
    Avatar von Mircot
    Mircot Mircot ist offline Mitglied Bronze
    Registriert seit
    Mar 2005
    Beiträge
    36
    Ich wollte die Deserialisierung gleich mit im Konstruktor der Klasse selber unterbringen.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
     public class Test
     {
     
     public string Teststring;
     [indent]private void Test()
     {
       [indent]Deserialisieren der Klasse und Zuweisen des Teststrings
       [/indent] }
     [/indent] }

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

    Vielleich denke ich auch falsch...
     

  6. #6
    Avatar von Norbert Eder
    Norbert Eder Norbert Eder ist offline Mitglied Diamant
    Registriert seit
    Feb 2004
    Ort
    Österreich / Graz
    Beiträge
    5.137
    Blog-Einträge
    51
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    
    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.
     

  7. #7
    Avatar von Mircot
    Mircot Mircot ist offline Mitglied Bronze
    Registriert seit
    Mar 2005
    Beiträge
    36
    Ich fitz mich mal durch und probier es mal aus!!

    Danke, wenn es probleme gibt, melde ich mch nochmal!!
    Geändert von Mircot (13.07.05 um 09:11 Uhr)
     

  8. #8
    Avatar von Mircot
    Mircot Mircot ist offline Mitglied Bronze
    Registriert seit
    Mar 2005
    Beiträge
    36
    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
     

  9. #9
    Avatar von Norbert Eder
    Norbert Eder Norbert Eder ist offline Mitglied Diamant
    Registriert seit
    Feb 2004
    Ort
    Österreich / Graz
    Beiträge
    5.137
    Blog-Einträge
    51
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    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;
    ...
     

  10. #10
    Avatar von Mircot
    Mircot Mircot ist offline Mitglied Bronze
    Registriert seit
    Mar 2005
    Beiträge
    36
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    
        [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......
     

  11. #11
    Avatar von Norbert Eder
    Norbert Eder Norbert Eder ist offline Mitglied Diamant
    Registriert seit
    Feb 2004
    Ort
    Österreich / Graz
    Beiträge
    5.137
    Blog-Einträge
    51
    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.
     

  12. #12
    Reverent Reverent ist offline Mitglied Gold
    Registriert seit
    Jun 2004
    Beiträge
    190
    Hallo Leute was ist das eigenlich das Serialisieren bzw. das Deserialisierung?
    Mfg
    Reverent
     

  13. #13
    Avatar von Christian Kusmanow
    Christian Kusmanow Christian Kusmanow ist offline Mitglied Diamant
    Registriert seit
    Aug 2004
    Ort
    Aachen (NRW)
    Beiträge
    2.208
    Blog-Einträge
    15
    Hallo Reverent!

    Schonmal MrGoogle gefragt?
    Im Gallileo OpenBook steht zB was dazu.
    Und 'nen netten Thread gibts dazu auch.
    Struktur in Datei speichern - Thread

    MfG, cosmo
     
    MfG,
    Christian

    Wer sein Problem definiert, hat es schon halb gelöst!

    Bitte markiert eure Themen als erledigt. Sonst macht so ein Forum als Nachschlagewerk keinen Sinn.

    The Code Project! - C# Programming | C# / VB.NET Pendants

    Regeln + Netiquette

    Liebe FIAEs, verlasst euch nicht auf das was in der Berufsschule "vermittelt" wird
    und vor allem nicht auf das, was euch die IHK dazu erzählt!
    Die haben so viel Ahnung von dem Gewerk, wie der Bundestag vom Haushalt...

  14. #14
    Avatar von Mircot
    Mircot Mircot ist offline Mitglied Bronze
    Registriert seit
    Mar 2005
    Beiträge
    36
    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; }
    }
     

  15. #15
    Avatar von Mircot
    Mircot Mircot ist offline Mitglied Bronze
    Registriert seit
    Mar 2005
    Beiträge
    36
    Ich glaube ich habe es, kann das sein das wir im Konstruktor noch die Funtion init() aufrufen müssen
     

Ähnliche Themen

  1. Deserialisierung in ein HashSet
    Von AvS im Forum Algorithmen & Datenstrukturen mit Java
    Antworten: 8
    Letzter Beitrag: 27.04.09, 15:39
  2. Konstruktor im Konstruktor
    Von ZodiacXP im Forum Java
    Antworten: 4
    Letzter Beitrag: 15.12.08, 16:33
  3. Deserialisierung mehrerer Objekte (Shapes)
    Von Hansguck im Forum Java
    Antworten: 5
    Letzter Beitrag: 12.12.07, 22:19
  4. Deserialisierung anzeigen
    Von The_Answer1985 im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 10
    Letzter Beitrag: 12.06.07, 10:17
  5. Konstruktor im Konstruktor aufrufen?
    Von zarrandreas im Forum .NET Archiv
    Antworten: 1
    Letzter Beitrag: 03.06.05, 16:45