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 9'da varsayılan olarak etkin | Hayır |
Not
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);
}
}
İlgili kurallar
CA2237: ISerializable türleri SerializableAttribute ile işaretleyin