【问题标题】:Sonarcube does not like my implementation of serializable exception classSonarqube 不喜欢我的可序列化异常类的实现
【发布时间】:2020-02-20 02:13:37
【问题描述】:

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

此规则会在未遵循 Microsoft 推荐的序列化模式的情况下实现 ISerializable 的类型产生问题。

  • System.SerializableAttribute 属性缺失。

  • 不可序列化的字段未使用System.NonSerializedAttribute 属性进行标记。

  • 没有序列化构造函数。

  • 未密封的类型具有不受保护的序列化构造函数。

  • 密封类型具有非私有的序列化构造函数。

  • 未密封类型的ISerializable.GetObjectData 既不是公共的也不是虚拟的。

  • 派生类型具有不调用基构造函数的序列化构造函数。

  • 派生类型具有不调用基方法的ISerializable.GetObjectData 方法。

  • 派生类型具有可序列化的字段,但 ISerializable.GetObjectData 方法未被覆盖。

【问题讨论】:

  • 我认为问题可能出在这种“未密封的类型具有不受保护的序列化构造函数”的情况。但是,如果我需要直接抛出这种类型的异常并从它派生出其他异常呢
  • 我认为它不喜欢自动属性的支持字段。我敢打赌它没有用序列化属性装饰。如果您删除该属性,或将其更改为具有根据规则装饰的显式支持字段的属性,会发生什么情况?
  • 问题确实与受保护成员与公共成员有关
  • 酷,你明白了吗?我对答案很感兴趣。
  • 你可以在下面回答你自己的问题,你知道吗?

标签: c# sonarqube iserializable


【解决方案1】:

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

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

    }

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

    }
}

【讨论】:

  • 谢谢!它有助于。这个答案应该有更多的赞成票。
  • 我收到有关不可为空的属性在受保护的构造函数中未初始化的分析警告。这只发生在我启用了可为空的引用类型时。不幸的是,我没有适当的信息来在这个特定的构造函数中初始化这些属性。而且我不想让它们可以为空,因为这会改变类的语义并影响调用代码。我该如何解决?
猜你喜欢
  • 1970-01-01
  • 2017-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-09
  • 2014-03-30
  • 2013-08-15
  • 1970-01-01
相关资源
最近更新 更多