对于以下异常实现, SonarCube 向我显示错误“更新 'ISerializable' 的此实现以符合推荐的序列化模式”:
[Serializable]
public class UnrecoverableException : Exception, ISerializable
{
public bool Ignore { get; }
public UnrecoverableException()
{
}
public UnrecoverableException(string message, Exception innerException)
: base(message, innerException)
{
}
protected UnrecoverableException(SerializationInfo info, StreamingContext context)
: base(info, context)
{
Ignore= info.GetBoolean(nameof(Ignore));
}
public UnrecoverableException(string message, bool ignore= false) : base(message)
{
Ignore= ignore;
}
public override void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue(nameof(Ignore), Ignore);
base.GetObjectData(info, context);
}
}
不知道这里有什么问题,对我来说似乎完全遵循这里描述的规则https://rules.sonarsource.com/csharp/tag/pitfall/RSPEC-3925
ISerializable
此规则在未遵循 Microsoft 推荐的序列化模式的情况下实现的类型引发了问题。
缺少该
System.SerializableAttribute
属性。不可序列化的字段没有用该
System.NonSerializedAttribute
属性标记。没有序列化构造函数。
未密封类型具有不受保护的序列化构造函数。
密封类型具有非私有的序列化构造函数。
非密封类型具有
ISerializable.GetObjectData
既不是公共的也不是虚拟的。派生类型具有不调用基构造函数的序列化构造函数。
派生类型有一个
ISerializable.GetObjectData
不调用基方法的方法。派生类型具有可序列化的字段,但该
ISerializable.GetObjectData
方法未被覆盖。