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 9 | No |
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.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);
}
}