Bagikan melalui


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 8 Tidak

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

CA2237: Menandai jenis ISerializable dengan SerializableAttribute

Baca juga