Share via


CA2237: Markera ISerializable-typer med SerializableAttribute

Property Värde
Regel-ID CA2237
Rubrik Markera ISerializable-typer med SerializableAttribute
Kategori Användning
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 8 Nej

Orsak

En externt synlig typ implementerar System.Runtime.Serialization.ISerializable gränssnittet och typen är inte markerad med System.SerializableAttribute attributet. Regeln ignorerar härledda typer vars bastyp inte är serialiserbar.

Regelbeskrivning

För att kunna identifieras av den vanliga språkkörningen som serialiserbar måste typer markeras med SerializableAttribute attributet även om typen använder en anpassad serialiseringsrutin genom implementeringen av ISerializable gränssnittet.

Så här åtgärdar du överträdelser

Om du vill åtgärda en överträdelse av den här regeln tillämpar du SerializableAttribute attributet på typen.

När du ska ignorera varningar

Ignorera inte en varning från den här regeln för undantagsklasser, eftersom de måste vara serialiserbara för att fungera korrekt mellan programdomäner.

Ignorera en varning

Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.

#pragma warning disable CA2237
// The code that's violating the rule is on this line.
#pragma warning restore CA2237

Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none i konfigurationsfilen.

[*.{cs,vb}]
dotnet_diagnostic.CA2237.severity = none

Mer information finns i Så här utelämnar du kodanalysvarningar.

Exempel

I följande exempel visas en typ som bryter mot regeln. Ta bort kommentaren till attributraden SerializableAttribute för att uppfylla regeln.

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);
    }
}