CA2237: ISerializable türleri SerializableAttribute ile işaretleyin

Özellik Değer
Kural Kimliği CA2237
Başlık ISerializable türleri SerializableAttribute ile 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

Dışarıdan görünen bir tür arabirimi uygular System.Runtime.Serialization.ISerializable ve tür özniteliğiyle System.SerializableAttribute işaretlenmez. Kural, temel türü serileştirilebilir olmayan türetilmiş türleri yoksayar.

Kural açıklaması

Ortak dil çalışma zamanı tarafından serileştirilebilir olarak tanınması için, tür arabiriminin SerializableAttribute uygulanması aracılığıyla özel bir serileştirme yordamı kullansa bile türlerin ISerializable özniteliğiyle işaretlenmesi gerekir.

İhlalleri düzeltme

Bu kuralın ihlalini düzeltmek için özniteliğini SerializableAttribute türüne uygulayın.

Uyarıların ne zaman bastırılması gerekiyor?

Uygulama etki alanları arasında düzgün çalışabilmeleri için serileştirilebilir olmaları gerektiğinden, özel durum sınıfları için bu kuraldan gelen bir uyarıyı gizlemeyin.

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 CA2237
// The code that's violating the rule is on this line.
#pragma warning restore CA2237

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.CA2237.severity = none

Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.

Örnek

Aşağıdaki örnekte kuralı ihlal eden bir tür gösterilmektedir. SerializableAttribute Kuralı karşılamak için öznitelik satırının açıklamasını kaldırın.

Imports System
Imports System.Runtime.Serialization
Imports System.Security.Permissions

Namespace ca2237

    ' <SerializableAttribute> _ 
    Public Class BaseType
        Implements ISerializable

        Dim baseValue As Integer

        Sub New()
            baseValue = 3
        End Sub

        Protected Sub New(
         info As SerializationInfo, context As StreamingContext)

            baseValue = info.GetInt32("baseValue")

        End Sub

        Overridable Sub GetObjectData(
         info As SerializationInfo, context As StreamingContext) _
         Implements ISerializable.GetObjectData

            info.AddValue("baseValue", baseValue)

        End Sub

    End Class

End Namespace
// [SerializableAttribute]
public class BaseType : ISerializable
{
    int baseValue;

    public BaseType()
    {
        baseValue = 3;
    }

    protected BaseType(
       SerializationInfo info, StreamingContext context)
    {
        baseValue = info.GetInt32("baseValue");
    }

    public virtual void GetObjectData(
       SerializationInfo info, StreamingContext context)
    {
        info.AddValue("baseValue", baseValue);
    }
}