CA2237: ISerializable-Typen mit SerializableAttribute markieren.

Eigenschaft Wert
Regel-ID CA2237
Titel ISerializable-Typen mit SerializableAttribute markieren.
Kategorie Verwendung
Fix führt oder führt nicht zur Unterbrechung Nicht unterbrechend
Standardmäßig in .NET 8 aktiviert Nein

Ursache

Ein extern sichtbarer Typ implementiert die System.Runtime.Serialization.ISerializable-Schnittstelle, und der Typ ist nicht mit dem System.SerializableAttribute-Attribut gekennzeichnet. Die Regel ignoriert abgeleitete Typen, deren Basistyp nicht serialisierbar ist.

Regelbeschreibung

Damit Typen von der Common Language Runtime als serialisierbar erkannt werden, müssen sie mit dem SerializableAttribute-Attribut markiert werden, auch wenn der Typ durch die Implementierung der ISerializable-Schnittstelle eine benutzerdefinierte Serialisierungsroutine verwendet.

Behandeln von Verstößen

Um den Verstoß gegen diese Regel zu beheben, wenden Sie auf den Typ das SerializableAttribute-Attribut an.

Wann sollten Warnungen unterdrückt werden?

Unterdrücken Sie eine Warnung dieser Regel nicht für Ausnahmeklassen, da sie serialisierbar sein müssen, um über AppDomains hinweg ordnungsgemäß zu funktionieren.

Unterdrücken einer Warnung

Um nur eine einzelne Verletzung zu unterdrücken, fügen Sie der Quelldatei Präprozessoranweisungen hinzu, um die Regel zu deaktivieren und dann wieder zu aktivieren.

#pragma warning disable CA2237
// The code that's violating the rule is on this line.
#pragma warning restore CA2237

Um die Regel für eine Datei, einen Ordner oder ein Projekt zu deaktivieren, legen Sie den Schweregrad in der Konfigurationsdatei auf none fest.

[*.{cs,vb}]
dotnet_diagnostic.CA2237.severity = none

Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.

Beispiel

Das folgende Beispiel zeigt einen Typ, der gegen die Regel verstößt. Heben Sie die Auskommentierung der SerializableAttribute-Attribut-Zeile auf, um die Regel zu erfüllen.

Imports System
Imports System.Runtime.Serialization
Imports System.Security.Permissions

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