CA2229: Menerapkan konstruktor serialisasi

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

CA2237: Tandai tipe ISerializable dengan SerializableAttribute

Lihat juga