CA2237: Contrassegnare i tipi ISerializable con SerializableAttribute

Proprietà valore
ID regola CA2237
Titolo Contrassegnare i tipi ISerializable con SerializableAttribute
Categoria Utilizzo
Correzione che causa un'interruzione o un'interruzione Nessuna interruzione
Abilitato per impostazione predefinita in .NET 8 No

Causa

Un tipo visibile esternamente implementa l'interfaccia System.Runtime.Serialization.ISerializable e il tipo non è contrassegnato con l'attributo System.SerializableAttribute . La regola ignora i tipi derivati il cui tipo di base non è serializzabile.

Descrizione regola

Per essere riconosciuto da Common Language Runtime come serializzabile, i tipi devono essere contrassegnati con l'attributo SerializableAttribute anche se il tipo usa una routine di serializzazione personalizzata tramite l'implementazione dell'interfaccia ISerializable .

Come correggere le violazioni

Per correggere una violazione di questa regola, applicare l'attributo SerializableAttribute al tipo .

Quando eliminare gli avvisi

Non eliminare un avviso da questa regola per le classi di eccezioni, perché devono essere serializzabili per funzionare correttamente nei domini applicazione.

Eliminare un avviso

Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.

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

Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità none su nel file di configurazione.

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

Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.

Esempio

Nell'esempio seguente viene illustrato un tipo che viola la regola. Rimuovere il commento dalla riga dell'attributo SerializableAttribute per soddisfare la regola.

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