2 votes

Sonarcube n'aime pas mon implémentation de la classe d'exception sérialisable

SonarCube me montre une erreur "Mettez à jour cette implémentation de 'ISerializable' pour qu'elle respecte le modèle de sérialisation recommandé" pour l'implémentation d'exception suivante :

[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);
    }
}

Je ne suis pas sûr de ce qui ne va pas ici car il me semble totalement suivre les règles décrites ici https://rules.sonarsource.com/csharp/tag/pitfall/RSPEC-3925

Cette règle soulève un problème sur les types qui implémentent ISerializable sans suivre le modèle de sérialisation recommandé par Microsoft.

  • L'attribut System.SerializableAttribute est manquant.

  • Les champs non sérialisables ne sont pas marqués avec l'attribut System.NonSerializedAttribute.

  • Il n'y a pas de constructeur de sérialisation.

  • Un type non scellé a un constructeur de sérialisation qui n'est pas protégé.

  • Un type scellé a un constructeur de sérialisation qui n'est pas privé.

  • Un type non scellé a une méthode ISerializable.GetObjectData qui n'est pas à la fois publique et virtuelle.

  • Un type dérivé a un constructeur de sérialisation qui n'appelle pas le constructeur de base.

  • Un type dérivé a une méthode ISerializable.GetObjectData qui n'appelle pas la méthode de base.

  • Un type dérivé a des champs sérialisables mais la méthode ISerializable.GetObjectData n'est pas substituée.

2voto

MattBH Points 356

Tout ce que j'avais à faire pour passer l'analyse Sonarqube était d'ajouter l'attribut [Serializable] à la classe et d'ajouter un constructeur protected. Par exemple :

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

    }

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

    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X