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 | CA2235 |
| Başlık | Tüm serileştirilebilir olmayan alanları işaretleyin |
| 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 |
Neden
Seri hale getirilemeyen bir örnek alan türü seri hale getirilebilir bir tür içinde bildirilir.
Kural açıklaması
Serileştirilebilir tür, özniteliğiyle System.SerializableAttribute işaretlenmiş bir türdür. Tür seri hale getirildiğinde, System.Runtime.Serialization.SerializationException tür serileştirilebilir olmayan ve arabirimi uygulamayan System.Runtime.Serialization.ISerializable bir tür örnek alanı içeriyorsa bir özel durum oluşturulur.
İpucu
CA2235, kendi serileştirme mantığını sağladıkları için ISerializable'yi uygulayan türlerin örnek alanları için tetiklenmez.
İhlalleri düzeltme
Bu kuralın ihlalini düzeltmek için özniteliği serileştirilebilir olmayan alana uygulayın System.NonSerializedAttribute .
Uyarıların ne zaman bastırılması gerekiyor?
Bu kuraldan gelen uyarıyı yalnızca, saha örneklerinin seri hale getirilip seri durumdan çıkarılmasına izin veren bir System.Runtime.Serialization.ISerializationSurrogate türü bildirildiğinde bastırın.
Uyarıyı gizleme
Yalnızca tek bir ihlali engellemek istiyorsanız, kuralı devre dışı bırakmak ve sonra yeniden etkinleştirmek için kaynak dosyanıza ön işlemci yönergeleri ekleyin.
#pragma warning disable CA2235
// The code that's violating the rule is on this line.
#pragma warning restore CA2235
Bir dosya, klasör veya projenin kuralını devre dışı bırakmak için, yapılandırma dosyasındaki önem derecesini noneolarak ayarlayın.
[*.{cs,vb}]
dotnet_diagnostic.CA2235.severity = none
Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.
Örnek
Aşağıdaki örnekte iki tür gösterilmektedir: kuralı ihlal eden ve kuralı karşılayan bir tür.
public class Mouse(int numberOfButtons, string scanType)
{
public int NumberOfButtons { get; } = numberOfButtons;
public string ScanType { get; } = scanType;
}
[Serializable]
public class InputDevices1
{
// Violates MarkAllNonSerializableFields.
readonly Mouse _opticalMouse;
public InputDevices1()
{
_opticalMouse = new Mouse(5, "optical");
}
}
[Serializable]
public class InputDevices2
{
// Satisfies MarkAllNonSerializableFields.
[NonSerialized]
readonly Mouse _opticalMouse;
public InputDevices2()
{
_opticalMouse = new Mouse(5, "optical");
}
}
Imports System
Imports System.Runtime.Serialization
Namespace ca2235
Public Class Mouse
ReadOnly Property NumberOfButtons As Integer
ReadOnly Property ScanType As String
Sub New(numberOfButtons As Integer, scanType As String)
Me.NumberOfButtons = numberOfButtons
Me.ScanType = scanType
End Sub
End Class
<SerializableAttribute>
Public Class InputDevices1
' Violates MarkAllNonSerializableFields.
Dim opticalMouse As Mouse
Sub New()
opticalMouse = New Mouse(5, "optical")
End Sub
End Class
<SerializableAttribute>
Public Class InputDevices2
' Satisfies MarkAllNonSerializableFields.
<NonSerializedAttribute>
Dim opticalMouse As Mouse
Sub New()
opticalMouse = New Mouse(5, "optical")
End Sub
End Class
End Namespace
Açıklamalar
Kural CA2235, ISerializable arabirimini uygulayan türleri analiz etmez (ayrıca SerializableAttribute özniteliği ile işaretlenmedikleri sürece). Bunun nedeni, CA2237 kuralının ISerializable arabirimini SerializableAttribute özniteliğiyle uygulayan türleri işaretlemenizi zaten önermesidir.