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 8'de 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.

Bahşiş

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 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 .