CA2235: Tüm serileştirilebilir olmayan alanları işaretleyin
Ö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 9'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 none
olarak 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 buttons;
string scanTypeValue;
public int NumberOfButtons
{
get { return buttons; }
}
public string ScanType
{
get { return scanTypeValue; }
}
public Mouse(int numberOfButtons, string scanType)
{
buttons = numberOfButtons;
scanTypeValue = scanType;
}
}
[Serializable]
public class InputDevices1
{
// Violates MarkAllNonSerializableFields.
Mouse opticalMouse;
public InputDevices1()
{
opticalMouse = new Mouse(5, "optical");
}
}
[Serializable]
public class InputDevices2
{
// Satisfies MarkAllNonSerializableFields.
[NonSerialized]
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 .