CA2229: Menerapkan konstruktor serialisasi
Properti | Nilai |
---|---|
ID Aturan | CA2229 |
Judul | Terapkan konstruktor serialisasi |
Golongan | Penggunaan |
Perbaikan bersifat disruptif atau non-disruptif | Non-disruptif |
Diaktifkan secara default di .NET 9 | No |
Catatan
Aturan ini dihapus di .NET 8 karena bertentangan dengan SYSLIB0051: API dukungan serialisasi warisan sudah usang.
Penyebab
Jenis mengimplementasikan System.Runtime.Serialization.ISerializable antarmuka, bukan delegasi atau antarmuka, dan salah satu kondisi berikut ini benar:
Jenis tidak memiliki konstruktor yang mengambil SerializationInfo objek dan StreamingContext objek (tanda tangan konstruktor serialisasi).
Jenis tidak tersegel dan pengubah akses untuk konstruktor serialisasinya tidak dilindungi (keluarga).
Jenisnya disegel dan pengubah akses untuk konstruktor serialisasinya tidak privat.
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 yang disegel, buat konstruktor menjadi privat; jika tidak, buat konstruktor menjadi terlindungi.
Kapan harus menekan peringatan
Jangan menekan 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: Menandai jenis ISerializable dengan SerializableAttribute