CA2237: Označte typy ISerializable pomocí SerializableAttribute

Vlastnost Hodnota
ID pravidla CA2237
Název Označte typy ISerializable pomocí SerializableAttribute
Kategorie Využití
Oprava způsobující chybu nebo chybu způsobující chybu Nenarušující
Povoleno ve výchozím nastavení v .NET 8 No

Příčina

Externě viditelný typ implementuje System.Runtime.Serialization.ISerializable rozhraní a typ není označen atributem System.SerializableAttribute . Pravidlo ignoruje odvozené typy, jejichž základní typ není serializovatelný.

Popis pravidla

Aby modul CLR (Common Language Runtime) rozpoznal jako serializovatelný, musí být typy označeny atributem SerializableAttribute , i když typ používá vlastní serializační rutinu ISerializable prostřednictvím implementace rozhraní.

Jak opravit porušení

Chcete-li opravit porušení tohoto pravidla, použijte SerializableAttribute atribut na typ.

Kdy potlačit upozornění

Nepotlačujte upozornění z tohoto pravidla pro třídy výjimek, protože musí být serializovatelné, aby správně fungovaly napříč doménami aplikace.

Potlačení upozornění

Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.

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

Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none konfiguračním souboru.

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

Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.

Příklad

Následující příklad ukazuje typ, který porušuje pravidlo. Odkomentujte řádek atributu SerializableAttribute tak, aby vyhovoval pravidlu.

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