Serialisierung abgeleiteter Klassen
-
Hallo zusammen,
ich habe eine abstrakte Klasse. Fünf andere Klassen erben von ihr.
[Serializable] public abstract class IField : ISerializable { protected Bitmap _picResource; // serialization strings private const string resourceSer = "PicResource"; private const string idSer = "IDSer"; public abstract int ID { get; } public Bitmap PicResource { get { return _picResource; } set { _picResource = value; } } public void GetObjectData(SerializationInfo info, StreamingContext context) { info.AddValue(resourceSer, _picResource); info.AddValue(idSer, ID); } }
Abgeleitete Klasse:
public class InvisibleBrick : IField { public const int InvisibleID = -1; public override int ID { get { return InvisibleID; } } public InvisibleBrick() { _picResource = NetworkGame.Properties.Resources.invisible; } }
Mein Ziel ist es nun, alle konkreten Klassen (wie InvisibleBrick) serialisierbar zu machen. Dazu muss zunächst die "GetObjectData" Methode implementiert werden und außerdem wird zur Deserialisierung ein bestimmter Konstruktor der Form
public IField(SerializationInfo info, StreamingContext ctxt) { //... }
gebraucht.
Doch die abstrakte Klasse kann nicht den Konstruktor definieren. Außerdem funktioniert sowas im Konstruktor auch nicht
ID = (int)info.GetValue("id", typeof(int));
weil die konkrete ID const ist.
Wie löse ich am besten das Problem ohne in jeder Kindklasse den gleichen Code zu kopieren?
Vielen Dank
-
freakC++ schrieb:
Dazu muss zunächst die "GetObjectData" Methode implementiert werden und außerdem wird zur Deserialisierung ein bestimmter Konstruktor der Form
Ehm, Du "musst" nicht, Du "kannst". Man kann GetObjectdata und den CTor überschreiben wenn man custom serialisieren will. Solange die standard Serialisierung des Framework für Dich OK ist musst Du lediglich [Serializble] auf den Childklassen setzen, also:
[Serializable] class bla { }
freakC++ schrieb:
Wie löse ich am besten das Problem ohne in jeder Kindklasse den gleichen Code zu kopieren?
Wenn die Klassen unterschiedliche Parameter haben musst Du eine Custom-Serialisierung eh pro Klasse implementieren, daran kommst Du nicht vorbei. Die Basisklasse kann schließlich nicht die Parameter der Childs kennen.