Condividi tramite


CA2235: Contrassegnare tutti i campi non serializzabili

Proprietà valore
ID regola CA2235
Title Contrassegnare tutti i campi non serializzabili
Categoria Utilizzo
La correzione causa un'interruzione o meno Non causa un'interruzione
Abilitato per impostazione predefinita in .NET 9 No

Causa

Un campo di istanza di un tipo non serializzabile viene dichiarato in un tipo serializzabile.

Descrizione regola

Un tipo serializzabile è un tipo contrassegnato con l'attributo System.SerializableAttribute . Quando il tipo viene serializzato, viene generata un'eccezione System.Runtime.Serialization.SerializationException se il tipo contiene un campo di istanza di un tipo non serializzabile e non implementa l'interfaccia System.Runtime.Serialization.ISerializable .

Suggerimento

CA2235 non viene generato per campi di istanza di tipi implementati ISerializable perché forniscono la propria logica di serializzazione.

Come correggere le violazioni

Per correggere una violazione di questa regola, applicare l'attributo System.NonSerializedAttribute al campo che non è serializzabile.

Quando eliminare gli avvisi

Eliminare un avviso da questa regola solo se viene dichiarato un System.Runtime.Serialization.ISerializationSurrogate tipo che consente la serializzazione e la deserializzazione delle istanze del campo.

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 CA2235
// The code that's violating the rule is on this line.
#pragma warning restore CA2235

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.CA2235.severity = none

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

Esempio

L'esempio seguente mostra due tipi: uno che viola la regola e uno che soddisfa la regola.

public class Mouse
{
    int buttons;
    string scanTypeValue;

    public int NumberOfButtons
    {
        get { return buttons; }
    }

    public string ScanType
    {
        get { return scanTypeValue; }
    }

    public Mouse(int numberOfButtons, string scanType)
    {
        buttons = numberOfButtons;
        scanTypeValue = scanType;
    }
}

[Serializable]
public class InputDevices1
{
    // Violates MarkAllNonSerializableFields.
    Mouse opticalMouse;

    public InputDevices1()
    {
        opticalMouse = new Mouse(5, "optical");
    }
}

[Serializable]
public class InputDevices2
{
    // Satisfies MarkAllNonSerializableFields.
    [NonSerialized]
    Mouse opticalMouse;

    public InputDevices2()
    {
        opticalMouse = new Mouse(5, "optical");
    }
}
Imports System
Imports System.Runtime.Serialization

Namespace ca2235

    Public Class Mouse

        ReadOnly Property NumberOfButtons As Integer

        ReadOnly Property ScanType As String

        Sub New(numberOfButtons As Integer, scanType As String)
            Me.NumberOfButtons = numberOfButtons
            Me.ScanType = scanType
        End Sub

    End Class

    <SerializableAttribute>
    Public Class InputDevices1

        ' Violates MarkAllNonSerializableFields.
        Dim opticalMouse As Mouse

        Sub New()
            opticalMouse = New Mouse(5, "optical")
        End Sub

    End Class

    <SerializableAttribute>
    Public Class InputDevices2

        ' Satisfies MarkAllNonSerializableFields.
        <NonSerializedAttribute>
        Dim opticalMouse As Mouse

        Sub New()
            opticalMouse = New Mouse(5, "optical")
        End Sub

    End Class

End Namespace

Osservazioni:

La regola CA2235 non analizza i tipi che implementano l'interfaccia ISerializable ,a meno che non siano contrassegnati anche con l'attributo SerializableAttribute . Questo perché la regola CA2237 consiglia già di contrassegnare i tipi che implementano l'interfaccia ISerializable con l'attributo SerializableAttribute .