ERLEDIGT
JA
JA
ANTWORTEN
1
1
ZUGRIFFE
788
788
EMPFEHLEN
-
Hi,
ich hab hier mal folgendes funktionierendes Minimalbeispiel gebaut:
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.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
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:
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?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
Gruß gott_ad
-
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:
(das :base(...) ist neu)Code :1 2 3 4
protected Unterklasse(SerializationInfo info, StreamingContext context):base(info,context){ some_number = info.GetInt16("Number"); parameter = info.GetString("Parameter"); }
Ähnliche Themen
-
Konstruktor
Von thehasso im Forum JavaAntworten: 6Letzter Beitrag: 29.09.09, 12:48 -
Probleme mit Konstruktor
Von 'GreenDragon' im Forum PHPAntworten: 3Letzter Beitrag: 05.07.09, 19:50 -
Konstruktor im Konstruktor
Von ZodiacXP im Forum JavaAntworten: 4Letzter Beitrag: 15.12.08, 16:33 -
Konstruktor
Von FingerSkill im Forum PHPAntworten: 4Letzter Beitrag: 29.04.08, 16:19 -
Konstruktor im Konstruktor aufrufen?
Von zarrandreas im Forum .NET ArchivAntworten: 1Letzter Beitrag: 03.06.05, 16:45





Zitieren
Login





