【发布时间】:2014-08-15 22:41:55
【问题描述】:
我有一个关于在继承类中正确实现 ISerializable 的问题。
我有两个类,AbstractBaseClass 和它的实现BaseClass。在执行派生自BaseClass 的FinalClass 之后,我收到了CA 警告:
CA2236 在 ISerializable 类型上调用基类方法方法 'FinalClass.FinalClass(SerializationInfo, StreamingContext)' 应该是 修改为调用其基类实现。
我不明白的是,如果提取的info.GetString("FileName") 和info.GetString("Password") 足以创建FinalClass 的实例,我为什么要调用基类?
问题:
1) 谁能给我解释一下?
2) 如果我保持原样并取消警告,我是否有任何设计问题?
谢谢
简化的代码示例是:
public abstract class AbstractBaseClass : ISerializable
{
[SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)]
public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue ...
//...
}
protected AbstractBaseClass() { }
protected AbstractBaseClass(SerializationInfo info, StreamingContext context)
{
if (info.GetInt32("Version") >= 1)
{
//...
}
}
}
public class BaseClass : AbstractBaseClass, ISerializable
{
public BaseClass() : base() { }
public override void GetObjectData(SerializationInfo info, StreamingContext context)
{
base.GetObjectData(info, context);
info.AddValue ...
}
protected BaseClass(SerializationInfo info, StreamingContext context)
: base(info, context)
{
if (info.GetInt32("Version") >= 1)
{
Connection = new MyConnection();
}
}
}
public class FinalClass : BaseClass
{
public string FileName { get; private set; }
public string Password { get; private set; }
public FinalClass(string fileName, string password)
: base()
{
FileName = fileName;
Password = password;
}
protected FinalClass(SerializationInfo info, StreamingContext context)
: this(info.GetString("FileName"), info.GetString("Password")) { }
public override void GetObjectData(SerializationInfo info, StreamingContext context)
{
base.GetObjectData(info, context);
info.AddValue("FileName", FileName);
info.AddValue("Password", Password);
}
}
【问题讨论】:
标签: c# .net inheritance serialization multiple-inheritance