StructureAufschalten Konstruktor in abgeleiteten Klasse, die durch Super-Klasse -Schnittstelle
Klasse B
erstreckt Klasse A
. Schnittstelle A
Geräte ISerializable
Die ISerializable
einen Konstruktor definiert:
public A(SerializationInfo info, StreamingContext ctxt)
Ich brauche eine specifc Umsetzung dieses Konstruktor in B
zu schreiben.
Ich habe versucht, einfach den Konstruktor in B
setzen - aber es wird nicht aufgerufen. Ich kann auch nicht scheinen, es zu überschreiben.
Das vereinfachte Problem
So A(SerializationInfo info, StreamingContext ctxt)
wird statt B(SerializationInfo info, StreamingContext ctxt) : base(info, ctxt)
immer genannt.
oder
new Base()
stellt nicht new Derived()
Der Code, der den (falschen) Konstruktor ruft:
UPDATE
- Die Objekte als Objekte behandelt werden, A - was könnte das Problem sein!
UPDATE
List<A> list = new List<A>();
list.Add(New B());
string s = JsonConvert.SerializeObject(list);
JsonConvert.DeserializeObject<List<A>>(s); <--- //it is called from here.
Irgendwelche Ideen dieses Erbe Problem zu lösen?
Einzelheiten
public class A: ISerializable
{
public A(int id, string name, string type, string category, string description, string data)
{
this.Id = id;
this.Name = name;
this.Type = type;
this.Category = category;
this.Description = description;
this.Data = data;
}
protected A(SerializationInfo info, StreamingContext ctxt)
{
Id = (int)info.GetValue("id", typeof(int));
Name = (String)info.GetValue("name", typeof(string));
Type = (String)info.GetValue("type", typeof(string));
Category = (String)info.GetValue("category", typeof(string));
Description = (String)info.GetValue("description", typeof(string));
Data = (String)info.GetValue("data", typeof(string));
}
}
public class B : A
{
public B(int id, string name, string type, string category, string description, string data) : base(id, name, type, category, description, data)
{
// specific B code
}
protected B(SerializationInfo info, StreamingContext ctxt) : base(info, ctxt){
// THIS NEVER GETS CALLED
// specific B code
}
}
'ISerializable' definiert keinen Konstruktor. Tatsächlich kann kein 'interface' einen Konstruktor definieren ... – haim770
Nun, es muss einen Konstruktor geben, der' SerializationInfo' und 'StreamingContext' übernimmt, damit die Serialisierung funktioniert. – capcapdk
Das Entfernen von es gibt die folgende Ausnahme: 'A hat keinen gültigen Konstruktor.Um ISerializable korrekt zu implementieren, sollte ein Konstruktor vorhanden sein, der die Parameter SerializationInfo und StreamingContext akzeptiert. " – capcapdk