CA2235: Należy oznaczyć wszystkie nieserializowane pola

Właściwości Wartość
Identyfikator reguły CA2235
Stanowisko Oznacz wszystkie pola nieprzeznaczone do serializacji
Kategoria Użycie
Poprawka powodująca niezgodność lub niezgodność Niezgodność
Domyślnie włączone na platformie .NET 8 Nie.

Przyczyna

Pola wystąpienia typu, który nie może być serializowany, jest zadeklarowany w typie, który jest możliwy do serializacji.

Opis reguły

Typ z możliwością serializacji jest taki, który jest oznaczony atrybutem System.SerializableAttribute . Gdy typ jest serializowany, zgłaszany jest wyjątek, System.Runtime.Serialization.SerializationException jeśli typ zawiera pole wystąpienia typu, który nie można serializować i nie implementuje interfejsu System.Runtime.Serialization.ISerializable .

Napiwek

CA2235 nie jest uruchamiany dla pól wystąpień typów implementujących ISerializable , ponieważ zapewniają własną logikę serializacji.

Jak naprawić naruszenia

Aby naprawić naruszenie tej reguły, zastosuj System.NonSerializedAttribute atrybut do pola, które nie można serializować.

Kiedy pomijać ostrzeżenia

Pomijanie ostrzeżenia z tej reguły tylko wtedy, gdy System.Runtime.Serialization.ISerializationSurrogate typ jest zadeklarowany, który umożliwia serializacji i deserializacji wystąpień pola.

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

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

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

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

Przykład

W poniższym przykładzie przedstawiono dwa typy: jeden, który narusza regułę, i jeden, który spełnia regułę.

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

Uwagi

Reguła CA2235 nie analizuje typów implementujących ISerializable interfejs (chyba że są one również oznaczone atrybutem SerializableAttribute ). Dzieje się tak, ponieważ reguła CA2237 już zaleca oznaczanie typów implementujących ISerializable interfejs z atrybutem SerializableAttribute .