CA2235: Az összes nem szerializálható mező megjelölése

Tulajdonság Érték
Szabályazonosító CA2235
Cím Az összes nem szerializálható mező megjelölése
Kategória Használat
A javítás romboló vagy nem romboló Nem törhető
Alapértelmezés szerint engedélyezve a .NET 10-ben Nem
Alkalmazandó nyelvek C# és Visual Basic

Ok

A nem szerializálható típusú példánymezők szerializálható típusban deklarálhatók.

Szabály leírása

A szerializálható típus az attribútummal System.SerializableAttribute megjelölt típus. Ha a típus szerializálva van, System.Runtime.Serialization.SerializationException kivételt dob, ha a típus olyan példánymezőt tartalmaz, amely nem szerializálható és nem valósítja meg a System.Runtime.Serialization.ISerializable interfészt.

Tipp.

A CA2235 nem lép működésbe azoknál a típust megvalósító ISerializable példánymezőknél, amelyek saját szerializálási logikát biztosítanak.

Szabálysértések kijavítása

A szabály megsértésének kijavításához alkalmazza az System.NonSerializedAttribute attribútumot a nem szerializálható mezőre.

Mikor kell letiltani a figyelmeztetéseket?

Csak akkor nyomja el a szabály figyelmeztetését, ha egy System.Runtime.Serialization.ISerializationSurrogate típust definiáltak, amely lehetővé teszi a mező példányainak szerializálását és deszerializálását.

Figyelmeztetés mellőzése

Ha csak egyetlen szabálysértést szeretne letiltani, adjon hozzá előfeldolgozási irányelveket a forrásfájlhoz a szabály letiltásához és újbóli engedélyezéséhez.

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

Ha le szeretné tiltani egy fájl, mappa vagy projekt szabályát, állítsa annak súlyosságát none a konfigurációs fájlban.

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

További információ: Kódelemzési figyelmeztetések letiltása.

Példa

Az alábbi példa két típust mutat be: egyet, amely megsérti a szabályt, és egyet, amely megfelel a szabálynak.

public class Mouse(int numberOfButtons, string scanType)
{
    public int NumberOfButtons { get; } = numberOfButtons;
    public string ScanType { get; } = scanType;
}

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

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

[Serializable]
public class InputDevices2
{
    // Satisfies MarkAllNonSerializableFields.
    [NonSerialized]
    readonly 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

Megjegyzések

A CA2235 szabály nem elemzi az ISerializable illesztőt megvalósító típusokat (kivéve, ha azokat az SerializableAttribute attribútummal is megjelöli). Ennek az az oka, hogy a CA2237 szabály már azt javasolja, hogy jelölje meg azokat a típusokat, amelyek implementálják az ISerializable interfészt az SerializableAttribute attribútummal.