Bagikan melalui


CA2237: Menandai jenis ISerializable dengan SerializableAttribute

Properti Nilai
ID Aturan CA2237
Judul Menandai jenis ISerializable dengan SerializableAttribute
Golongan Penggunaan
Perbaikan bersifat disruptif atau non-disruptif Non-disruptif
Diaktifkan secara default di .NET 8 Tidak

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 oleh runtime bahasa umum sebagai dapat diserialisasikan, jenis harus ditandai dengan SerializableAttribute atribut bahkan jika jenis menggunakan rutinitas serialisasi kustom melalui implementasi ISerializable antarmuka.

Cara memperbaiki pelanggaran

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

Kapan harus menekan peringatan

Jangan menekan peringatan dari aturan ini untuk kelas pengecualian, karena harus dapat diserialisasikan untuk bekerja 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. Batalkan SerializableAttribute komentar baris atribut untuk memenuhi aturan.

Imports System
Imports System.Runtime.Serialization
Imports System.Security.Permissions

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);
    }
}