CA2229: Serileştirme oluşturucularını uygulayın

Özellik Değer
Kural Kimliği CA2229
Başlık Serileştirme oluşturucularını uygulayın
Kategori Kullanım
Düzeltme bozucu ya da bozmayan olabilir Kesintisiz
.NET 10'da varsayılan olarak etkin Hayır
Geçerli diller C# ve Visual Basic

Not

Bu kural, SYSLIB0051: Eski serileştirme desteği API'leri artık kullanılmıyor ile çeliştiği için .NET 8'de kaldırıldı.

Neden

Türü arabirimini System.Runtime.Serialization.ISerializable uygular, bir temsilci veya arabirim değildir ve aşağıdaki koşullardan biri doğrudur:

  • Tür, bir SerializationInfo nesnesi ve bir StreamingContext nesnesi alan bir (serileştirme oluşturucusunun imzası) oluşturucuya sahip değil.

  • Türü korumasız ve serileştirme oluşturucusunun erişim değiştiricisi korunmaz (aile).

  • Türü mühürlüdür ve serileştirme oluşturucusunun erişim belirleyicisi özel olmayan bir yapıya sahiptir.

Kural açıklaması

Bu kural, özel serileştirmeyi destekleyen türler için geçerlidir. Bir tür, ISerializable arabirimi uygularsa özel serileştirmeyi destekler. Serileştirme oluşturucu, yöntemi kullanılarak ISerializable.GetObjectData serileştirilmiş nesneleri seri durumdan çıkarmak veya yeniden oluşturmak için gereklidir.

İhlalleri düzeltme

Bu kural ihlalini düzeltmek için serileştirme yapıcısını uygulayın. Kapalı bir sınıf için kurucusunu özel yapın; aksi takdirde korunmuş yapın.

Uyarıların ne zaman bastırılması gerekiyor?

Kuralın ihlalini bastırmayın. Tür deserialize edilemez ve birçok senaryoda işlev görmez.

Örnek

Aşağıdaki örnekte kuralı karşılayan bir tür gösterilmektedir.

[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: ISerializable türleri SerializableAttribute ile işaretleyin

Ayrıca bkz.