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 9 | 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.
Opmerking
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.Runtime.Serialization
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);
}
}