9

对于以下异常实现, 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方法未被覆盖。

4

1 回答 1

25

要通过 Sonarqube 的分析,我所要做的就是将[Serializable]属性添加到类并添加protected构造函数。IE:

[Serializable]
public class BadRequestException : Exception
{
    public BadRequestException(string message) : base(message)
    {

    }

    protected BadRequestException(SerializationInfo info, StreamingContext context) : base(info, context)
    {

    }
}
于 2020-12-17T12:02:58.150 回答