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.