2016-07-24 18 views
2

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 
} 


} 
+6

'ISerializable' definiert keinen Konstruktor. Tatsächlich kann kein 'interface' einen Konstruktor definieren ... – haim770

+0

Nun, es muss einen Konstruktor geben, der' SerializationInfo' und 'StreamingContext' übernimmt, damit die Serialisierung funktioniert. – capcapdk

+0

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

Antwort

0

Dies sollte Ihnen helfen, einige Code in abgeleiteten Klasse in Ihrem Fall zu nennen. Es versucht nur, dir eine Option zu geben. Ohne den Kontext zu kennen, kann ich den Richter nicht tun. Also check out what is virtual member call.

Sie können eine virtuelle Methode in A definieren, sie in A aufrufen (SerializationInfo info, StreamingContext ctxt).

Dann in B kopieren/bewegen Sie einige der Logik in die übergeordnete Methode. Wenn A (SerializationInfo info, StreamingContext ctxt) aufgerufen wird, wird auch B's Foo() aufgerufen.

public sealed class B : A 
{ 
    public B(string name) : base(name) 
    { 
    } 

    public override void Foo() 
    { 
     Tag = "B"; 
    } 

    public string Tag { get; set; } 

    protected B(SerializationInfo info, StreamingContext ctxt) : base(info, ctxt) 
    { 
    } 
}