CA2237: Markera ISerializable-typer med SerializableAttribute
Property | Värde |
---|---|
Regel-ID | CA2237 |
Title | Markera ISerializable-typer med SerializableAttribute |
Kategori | Användning |
Korrigeringen är icke-bakåtkompatibel | Icke-icke-bryta |
Aktiverad som standard i .NET 9 | Nej |
Orsak
En externt synlig typ implementerar System.Runtime.Serialization.ISerializable gränssnittet och typen är inte markerad med System.SerializableAttribute attributet. Regeln ignorerar härledda typer vars bastyp inte är serialiserbar.
Regelbeskrivning
För att kunna identifieras av den vanliga språkkörningen som serialiserbar måste typer markeras med SerializableAttribute attributet även om typen använder en anpassad serialiseringsrutin genom implementeringen av ISerializable gränssnittet.
Så här åtgärdar du överträdelser
Om du vill åtgärda en överträdelse av den här regeln tillämpar du SerializableAttribute attributet på typen.
När du ska ignorera varningar
Ignorera inte en varning från den här regeln för undantagsklasser, eftersom de måste vara serialiserbara för att fungera korrekt mellan programdomäner.
Ignorera en varning
Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.
#pragma warning disable CA2237
// The code that's violating the rule is on this line.
#pragma warning restore CA2237
Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none
i konfigurationsfilen.
[*.{cs,vb}]
dotnet_diagnostic.CA2237.severity = none
Mer information finns i Så här utelämnar du kodanalysvarningar.
Exempel
I följande exempel visas en typ som bryter mot regeln. Ta bort kommentaren till attributraden SerializableAttribute för att uppfylla regeln.
Imports System.Runtime.Serialization
Namespace ca2237
' <SerializableAttribute> _
Public Class BaseType
Implements ISerializable
Dim baseValue As Integer
Sub New()
baseValue = 3
End Sub
Protected Sub New(
info As SerializationInfo, context As StreamingContext)
baseValue = info.GetInt32("baseValue")
End Sub
Overridable Sub GetObjectData(
info As SerializationInfo, context As StreamingContext) Implements ISerializable.GetObjectData
info.AddValue("baseValue", baseValue)
End Sub
End Class
End Namespace
// [SerializableAttribute]
public class BaseType : ISerializable
{
int baseValue;
public BaseType()
{
baseValue = 3;
}
protected BaseType(
SerializationInfo info, StreamingContext context)
{
baseValue = info.GetInt32("baseValue");
}
public virtual void GetObjectData(
SerializationInfo info, StreamingContext context)
{
info.AddValue("baseValue", baseValue);
}
}