Bahasa

CA2235: Tandai semua bidang yang tidak dapat dibuat serial

Properti Nilai
ID Aturan CA2235
Judul Menandai semua bidang yang tidak dapat diserialisasikan
Kategori Penggunaan
Perbaikan bersifat merusak atau tidak merusak Tidak terputus
Diaktifkan secara default di .NET 10 Tidak
Bahasa yang berlaku C# dan Visual Basic

Penyebab

Bidang instans dari tipe yang tidak dapat diserialisasi dideklarasikan dalam tipe yang dapat diserialisasi.

Deskripsi aturan

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

Tips

CA2235 tidak memicu untuk bidang instans dari tipe yang mengimplementasikan 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 jenis System.Runtime.Serialization.ISerializationSurrogate dinyatakan yang memungkinkan instans bidang dapat diserialisasi 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 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

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 .