Sdílet prostřednictvím


CA2235: Označte všechna neserializovatelná pole

Vlastnost Hodnota
ID pravidla CA2235
Název Označte všechna neserializovatelná pole
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

Neserializovatelný typ pole instance je deklarován v serializovatelném typu.

Popis pravidla

Serializovatelný typ je typ, který je označen atributem System.SerializableAttribute . Při serializaci typu je vyvolána výjimka, System.Runtime.Serialization.SerializationException pokud typ obsahuje pole instance typu, který není serializovatelný a neimplementuje System.Runtime.Serialization.ISerializable rozhraní.

Tip

CA2235 se neaktivuje pro pole instancí typů, které implementují ISerializable , protože poskytují vlastní logiku serializace.

Jak opravit porušení

Chcete-li opravit porušení tohoto pravidla, použijte System.NonSerializedAttribute atribut na pole, které není serializovatelné.

Kdy potlačit upozornění

Potlačit upozornění z tohoto pravidla pouze v případě System.Runtime.Serialization.ISerializationSurrogate , že je deklarován typ, který umožňuje serializovat a deserializovat instance pole.

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

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.CA2235.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 dva typy: jeden, který porušuje pravidlo, a druhý, který pravidlo splňuje.

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

Poznámky

Pravidlo CA2235 neanalyzuje typy, které implementují ISerializable rozhraní (pokud nejsou také označeny atributem SerializableAttribute ). Důvodem je to, že pravidlo CA2237 již doporučuje typy označení, které implementují ISerializable rozhraní s atributem SerializableAttribute .