CA2237: Należy oznaczyć typ ISerializable atrybutem SerializableAttribute

Właściwości Wartość
Identyfikator reguły CA2237
Stanowisko Oznacz typy ISerializable atrybutem SerializableAttribute
Kategoria Użycie
Poprawka powodująca niezgodność lub niezgodność Niezgodność
Domyślnie włączone na platformie .NET 8 Nie.

Przyczyna

Typ widoczny zewnętrznie implementuje System.Runtime.Serialization.ISerializable interfejs, a typ nie jest oznaczony atrybutem System.SerializableAttribute . Reguła ignoruje typy pochodne, których typ podstawowy nie można serializować.

Opis reguły

Aby można było rozpoznać przez środowisko uruchomieniowe języka wspólnego jako możliwe do serializacji, typy muszą być oznaczone atrybutem SerializableAttribute , nawet jeśli typ używa niestandardowej procedury serializacji za pomocą implementacji interfejsu ISerializable .

Jak naprawić naruszenia

Aby naprawić naruszenie tej reguły, zastosuj SerializableAttribute atrybut do typu.

Kiedy pomijać ostrzeżenia

Nie pomijaj ostrzeżenia z tej reguły dla klas wyjątków, ponieważ muszą one być serializowalne, aby działały poprawnie w domenach aplikacji.

Pomijanie ostrzeżenia

Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.

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

Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.

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

Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.

Przykład

W poniższym przykładzie pokazano typ, który narusza regułę. Usuń komentarz z wiersza atrybutu SerializableAttribute , aby spełnić regułę.

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