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 |
| Hataya neden olan veya bozulmayan düzeltme | Hataya neden olmayan |
| .NET 10'da varsayılan olarak etkin | Hayır |
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ığından uygulayan ISerializable türlerdeki ö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?
Yalnızca alan örneklerinin seri hale getirilip seri durumdan çıkarılmasına izin veren bir System.Runtime.Serialization.ISerializationSurrogate tür bildirilirse bu kuraldan gelen uyarıyı 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 arabirimini uygulayan ISerializable türleri analiz etmez (öznitelikle SerializableAttribute de işaretlenmedikleri sürece). Bunun nedeni , CA2237 kuralının arabirimini özniteliğiyle uygulayan türleri işaretlemeyi ISerializable zaten önermesidir SerializableAttribute .