Share via


CA2237: Mark ISerializable types with SerializableAttribute

Eigenschappen Weergegeven als
Regel-id CA2237
Titel ISerializable typen markeren met SerializableAttribute
Categorie Gebruik
Oplossing is brekend of niet-brekend Niet-brekend
Standaard ingeschakeld in .NET 8 Nee

Oorzaak

Een extern zichtbaar type implementeert de System.Runtime.Serialization.ISerializable interface en het type wordt niet gemarkeerd met het System.SerializableAttribute kenmerk. De regel negeert afgeleide typen waarvan het basistype niet serialiseerbaar is.

Beschrijving van regel

Als u wilt worden herkend door de common language runtime als serializeerbaar, moeten typen worden gemarkeerd met het SerializableAttribute kenmerk, zelfs als het type een aangepaste serialisatieroutine gebruikt via de implementatie van de ISerializable interface.

Schendingen oplossen

Als u een schending van deze regel wilt oplossen, past u het SerializableAttribute kenmerk toe op het type.

Wanneer waarschuwingen onderdrukken

Onderdrukt geen waarschuwing van deze regel voor uitzonderingsklassen, omdat ze serialiseerbaar moeten zijn om correct te kunnen werken in toepassingsdomeinen.

Een waarschuwing onderdrukken

Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.

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

Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst none ervan in op het configuratiebestand.

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

Zie Codeanalysewaarschuwingen onderdrukken voor meer informatie.

Voorbeeld

In het volgende voorbeeld ziet u een type dat de regel schendt. Verwijder opmerkingen bij de SerializableAttribute kenmerkregel om aan de regel te voldoen.

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