Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
| Properti | Nilai |
|---|---|
| ID Aturan | CA2229 |
| Judul | Terapkan konstruktor serialisasi |
| Kategori | Penggunaan |
| Perbaikan bersifat merusak atau tidak merusak | Tidak terputus |
| Diaktifkan secara default di .NET 10 | Tidak |
| Bahasa yang berlaku | C# dan Visual Basic |
Catatan
Aturan ini dihapus di .NET 8 karena bertentangan dengan SYSLIB0051: API dukungan serialisasi warisan sudah usang.
Penyebab
Jenis mengimplementasikan antarmuka System.Runtime.Serialization.ISerializable, bukan delegat atau antarmuka, dan salah satu kondisi berikut ini benar:
Jenis tidak memiliki konstruktor yang menerima objek SerializationInfo dan objek StreamingContext (signature konstruktor serialisasi).
Jenis tidak tersegel dan pengubah akses untuk konstruktor serialisasinya tidak dilindungi (keluarga).
Jenisnya tertutup dan pengubah akses untuk konstruktor serialisasinya tidak pribadi.
Deskripsi aturan
Aturan ini relevan untuk jenis yang mendukung serialisasi kustom. Jenis mendukung serialisasi kustom jika mengimplementasikan ISerializable antarmuka. Konstruktor serialisasi diperlukan untuk mendeserialisasi, atau membuat ulang, objek yang telah diserialisasikan menggunakan ISerializable.GetObjectData metode .
Cara memperbaiki pelanggaran
Untuk memperbaiki pelanggaran aturan ini, terapkan konstruktor serialisasi. Untuk kelas tertutup, buat konstruktor menjadi privat; jika tidak, jadikan terlindungi.
Kapan harus menekan peringatan
Jangan mengabaikan pelanggaran aturan. Jenis tidak akan dapat dideserialisasi, dan tidak akan berfungsi dalam banyak skenario.
Contoh
Contoh berikut menunjukkan jenis yang memenuhi aturan.
[Serializable]
public class SerializationConstructorsRequired : ISerializable
{
private int n1;
// This is a regular constructor.
public SerializationConstructorsRequired()
{
n1 = -1;
}
// This is the serialization constructor.
// Satisfies rule: ImplementSerializationConstructors.
protected SerializationConstructorsRequired(
SerializationInfo info,
StreamingContext context)
{
n1 = (info.GetValue(nameof(n1), typeof(int)) != null) ?
(int)info.GetValue(nameof(n1), typeof(int))! :
-1;
}
// The following method serializes the instance.
void ISerializable.GetObjectData(SerializationInfo info,
StreamingContext context)
{
info.AddValue(nameof(n1), n1);
}
}
Aturan terkait
CA2237: Tandai tipe ISerializable dengan SerializableAttribute