Megosztás a következőn keresztül:


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 kompatibilitástörő vagy nem törik Nem törés
Alapértelmezés szerint engedélyezve a .NET 8-ban Nem

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, kivételt jelent, System.Runtime.Serialization.SerializationException ha a típus olyan példánymezőt tartalmaz, amely nem szerializálható , és nem implementálja az interfészt System.Runtime.Serialization.ISerializable .

Tipp.

A CA2235 nem aktiválja a implementálható ISerializable példánymezőket, mert 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 tiltsa el a szabály figyelmeztetését, ha System.Runtime.Serialization.ISerializationSurrogate olyan típus van deklarálva, 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 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

Remarks

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.