结构
班级B
扩展了班级A
。
A
实现了接口ISerializable
ISerializable
定义了一个构造函数:
public A(SerializationInfo info, StreamingContext ctxt)
我需要在B
中编写这个构造函数的特定实现。
我试过简单地将构造函数放在B
中 - 但它不会被调用。
我似乎无法覆盖它。
简化问题
因此始终会调用A(SerializationInfo info, StreamingContext ctxt)
而不是B(SerializationInfo info, StreamingContext ctxt) : base(info, ctxt)
。
或
new Base()
不会致电new Derived()
调用(错误)构造函数的代码:
更新
更新
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.
解决这个继承问题的任何想法?
详情
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
}
}
答案 0 :(得分:0)
这可以帮助您在您的案例中调用派生类中的一些代码。它只是试图给你一个选择。在不知道背景的情况下,我无法做出判断。 Also check out what is virtual member call
您可以在A中定义虚拟方法,在A(SerializationInfo info,StreamingContext ctxt)中调用它。
public class A : ISerializable
{
public A(string name)
{
}
public virtual void Foo()
{
}
protected A(SerializationInfo info, StreamingContext ctxt)
{
Foo();
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
}
}
然后在B中复制/将一些逻辑移入覆盖方法。当A(SerializationInfo info,StreamingContext ctxt)被调用时,B&#39; Foo()也会被调用。
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)
{
}
}