tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
1
ZUGRIFFE
788
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    gott_ad gott_ad ist offline Mitglied
    Registriert seit
    Jul 2004
    Ort
    Rostock (MV)
    Beiträge
    16
    Hi,

    ich hab hier mal folgendes funktionierendes Minimalbeispiel gebaut:
    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
    
    using System;
    using System.Runtime.Serialization;
    using System.Runtime.Serialization.Formatters.Binary;
    using System.IO;
     
    namespace BinarySerialisierungsTest {
        // Einstiegsklasse
        class MainClass {
            [STAThread]
            public static void Main(string[] args) {
                FileStream fs = new FileStream(@"c:\serialisierungstest.dat",FileMode.Create);
                BinaryFormatter bf = new BinaryFormatter();
                Unterklasse u = new Unterklasse("u");
                bf.Serialize(fs, u);
                fs.Close();
            }
        }//end MainClass
        
        [Serializable]
        public class Oberklasse{
            public Oberklasse(string ausgabe){
                Console.WriteLine("ich bin OBERKLASSE und soll: "+ausgabe+" sagen");
            }
        }// end Oberklasse
        
        [Serializable]
        public class Unterklasse : Oberklasse {
            private int some_number = 5;
            private string parameter = "";
            [NonSerialized] System.Windows.Forms.Form eineForm = new System.Windows.Forms.Form();
            public Unterklasse(string ausgabe2) : base (ausgabe2){
                Console.WriteLine("ich bin UNTERKLASSE und soll: "+ausgabe2+" sagen");
                parameter = ausgabe2;
                eineForm.ShowDialog();
            }
        }// end Unterklasse
    }// end namespace
    Soweit läuft das Beispiel. Weil ich Windows.Forms.Form nicht serialisieren kann, hab ich sie als [NonSerialized] deklariert. Soweit alles wie ich es will.

    Jetzt das eigentliche Problem. Ich finde es sehr umständlich über alle Attribute [NonSerialized] zu setzen. Deshalb gibt es ja die Möglichkeit das ISerializable Interface zu implementieren. Entsprechend würde die geänderte Unterklasse so aussehen:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
        [Serializable]
        public class Unterklasse : Oberklasse, ISerializable {
            private int some_number = 5;
            private string parameter = "";
            System.Windows.Forms.Form eineForm = new System.Windows.Forms.Form();
            public Unterklasse(string ausgabe2) : base (ausgabe2){
                Console.WriteLine("ich bin UNTERKLASSE und soll: "+ausgabe2+" sagen");
                parameter = ausgabe2;
                eineForm.ShowDialog();
            }
            protected Unterklasse(SerializationInfo info, StreamingContext context){
                some_number = info.GetInt16("Number");
                parameter = info.GetString("Parameter");
            }
            void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context){
                info.AddValue("Number",some_number);
                info.AddValue("Parameter",parameter);
            }
        }// end Unterklasse
    Das Problem hierbei ist, dass man zum Deserialisieren einen zweiten Konstruktor erstellen muss. Soweit wäre das nicht schlimm, aber mein Konstruktor MUSS den Konstruktor der Oberklasse aufrufen und muss diesem auch einen Parameter übergeben. Den zu übergebenen Parameter könnte ich auch serialisieren (mach ich ja im Beispiel mit dem Attribut "string parameter") und dann wieder deserialisieren und den originalkonstruktor per Hand aufrufen und per hand den Parameter übergeben, aber soweit komme ich leider nicht. Das Beispiel wird nicht kompiliert, weil der zweite Konstruktor (zum deserialisieren) nicht die Oberklasse aufruft. Habt ihr irgendwelche Ideen?
    Gruß gott_ad
     

  2. #2
    gott_ad gott_ad ist offline Mitglied
    Registriert seit
    Jul 2004
    Ort
    Rostock (MV)
    Beiträge
    16
    Okay, ich habs!
    In Oberklasse muss ebenfalls ein zweiter Konstruktor eingefügt werden (Oberklasse braucht nicht das ISerializable Interface):
    Code :
    1
    2
    
    protected Oberklasse(SerializationInfo info, StreamingContext context){
    }

    und in der Unterklasse muss der zweite Konstruktor so abgeändert werden:
    Code :
    1
    2
    3
    4
    
    protected Unterklasse(SerializationInfo info, StreamingContext context):base(info,context){
        some_number = info.GetInt16("Number");
        parameter = info.GetString("Parameter");
    }
    (das :base(...) ist neu)
     

Ähnliche Themen

  1. Konstruktor
    Von thehasso im Forum Java
    Antworten: 6
    Letzter Beitrag: 29.09.09, 12:48
  2. Probleme mit Konstruktor
    Von 'GreenDragon' im Forum PHP
    Antworten: 3
    Letzter Beitrag: 05.07.09, 19:50
  3. Konstruktor im Konstruktor
    Von ZodiacXP im Forum Java
    Antworten: 4
    Letzter Beitrag: 15.12.08, 16:33
  4. Konstruktor
    Von FingerSkill im Forum PHP
    Antworten: 4
    Letzter Beitrag: 29.04.08, 16:19
  5. Konstruktor im Konstruktor aufrufen?
    Von zarrandreas im Forum .NET Archiv
    Antworten: 1
    Letzter Beitrag: 03.06.05, 16:45