CA2237: Tandai tipe ISerializable dengan SerializableAttribute

Properti Nilai
ID Aturan CA2237
Judul Menandai jenis ISerializable dengan SerializableAttribute
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

Jenis yang terlihat secara eksternal mengimplementasikan System.Runtime.Serialization.ISerializable antarmuka dan jenisnya tidak ditandai dengan System.SerializableAttribute atribut . Aturan mengabaikan jenis turunan yang jenis dasarnya tidak dapat diserialisasikan.

Deskripsi aturan

Untuk dikenali sebagai serializable oleh common language runtime, tipe harus ditandai dengan atribut SerializableAttribute bahkan jika tipe menggunakan rutinitas serialisasi kustom melalui implementasi antarmuka ISerializable.

Cara memperbaiki pelanggaran

Untuk memperbaiki pelanggaran aturan ini, terapkan atribut SerializableAttribute ke jenis.

Kapan harus menekan peringatan

Jangan sembunyikan peringatan dari aturan ini untuk kelas pengecualian, karena kelas tersebut harus dapat diserialisasikan agar berfungsi dengan benar di seluruh domain aplikasi.

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

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

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

Untuk informasi selengkapnya, lihat Cara menyembunyikan peringatan analisis kode.

Contoh

Contoh berikut menunjukkan jenis yang melanggar aturan. Hapus komentar dari baris atribut SerializableAttribute untuk memenuhi aturan.

Imports System.Runtime.Serialization

Namespace ca2237

    ' <SerializableAttribute> _ 
    Public Class BaseType
        Implements ISerializable

        Dim baseValue As Integer

        Sub New()
            baseValue = 3
        End Sub

        Protected Sub New(
         info As SerializationInfo, context As StreamingContext)

            baseValue = info.GetInt32("baseValue")

        End Sub

        Overridable Sub GetObjectData(
         info As SerializationInfo, context As StreamingContext) Implements ISerializable.GetObjectData

            info.AddValue("baseValue", baseValue)

        End Sub
    End Class

End Namespace
// [SerializableAttribute]
public class BaseType : ISerializable
{
    int baseValue;

    public BaseType()
    {
        baseValue = 3;
    }

    protected BaseType(
       SerializationInfo info, StreamingContext context)
    {
        baseValue = info.GetInt32("baseValue");
    }

    public virtual void GetObjectData(
       SerializationInfo info, StreamingContext context)
    {
        info.AddValue("baseValue", baseValue);
    }
}