Bagikan melalui


CA2235: Tandai semua bidang yang tidak dapat dibuat serial

Properti Nilai
ID Aturan CA2235
Judul Menandai semua bidang yang tidak dapat diserialisasikan
Golongan Penggunaan
Perbaikan bersifat disruptif atau non-disruptif Non-disruptif
Diaktifkan secara default di .NET 8 Tidak

Penyebab

Bidang instans dari jenis yang tidak dapat diserialisasikan dideklarasikan dalam jenis yang dapat diserialisasikan.

Deskripsi aturan

Jenis yang dapat diserialisasikan adalah jenis yang ditandai dengan System.SerializableAttribute atribut . Saat jenis diserialisasikan, System.Runtime.Serialization.SerializationException pengecualian akan dilemparkan jika jenis berisi bidang instans jenis yang tidak dapat diserialisasikan dan tidak mengimplementasikan System.Runtime.Serialization.ISerializable antarmuka.

Tip

CA2235 tidak diaktifkan untuk bidang instans jenis yang diterapkan ISerializable karena mereka menyediakan logika serialisasi mereka sendiri.

Cara memperbaiki pelanggaran

Untuk memperbaiki pelanggaran aturan ini, terapkan System.NonSerializedAttribute atribut ke bidang yang tidak dapat diserialisasikan.

Kapan harus menekan peringatan

Hanya tekan peringatan dari aturan ini jika System.Runtime.Serialization.ISerializationSurrogate jenis dinyatakan yang memungkinkan instans bidang diserialisasikan dan dideserialisasi.

Menyembunyikan peringatan

Jika Anda hanya ingin menyembunyikan satu pelanggaran, tambahkan arahan praprosedur ke file sumber Anda untuk dinonaktifkan lalu aktifkan kembali aturannya.

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

Untuk menonaktifkan aturan untuk file, folder, atau proyek, atur tingkat keparahannya ke none dalam file konfigurasi.

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

Untuk informasi selengkapnya, lihat Cara menyembunyikan peringatan analisis kode.

Contoh

Contoh berikut menunjukkan dua jenis: satu yang melanggar aturan dan yang memenuhi aturan.

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

Keterangan

Aturan CA2235 tidak menganalisis jenis yang mengimplementasikan ISerializable antarmuka (kecuali mereka juga ditandai dengan SerializableAttribute atribut ). Ini karena aturan CA2237 sudah merekomendasikan jenis penandaan yang mengimplementasikan ISerializable antarmuka dengan SerializableAttribute atribut .