Aracılığıyla paylaş


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
Hataya neden olan veya bozulmayan düzeltme Hataya neden olmayan
.NET 8'de varsayılan olarak etkin Hayır

Dekont

Bu kural SYSLIB0051: Eski serileştirme desteği API'leri eski olduğundan .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ün bir nesnesi ve bir SerializationInfo nesnesi (serileştirme oluşturucusunun imzası) alan bir StreamingContext oluşturucu yoktur.

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

  • Türü korumalıdır ve serileştirme oluşturucusunun erişim değiştiricisi özel değildir.

Kural açıklaması

Bu kural, özel serileştirmeyi destekleyen türler için geçerlidir. Bir tür, arabirimini uygularsa özel serileştirmeyi ISerializable 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 seri hale getirme yapıcısını uygular. 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ü seri durumdan çıkarılamaz ve birçok senaryoda çalışmaz.

Ö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.