Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
| Ö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);
}
}
İlgili kurallar
CA2237: ISerializable türleri SerializableAttribute ile işaretleyin