CA2237: Označte typy ISerializable pomocí SerializableAttribute
Vlastnost | Hodnota |
---|---|
ID pravidla | CA2237 |
Název | Označte typy ISerializable pomocí SerializableAttribute |
Kategorie | Využití |
Oprava způsobující chybu nebo chybu způsobující chybu | Nenarušující |
Povoleno ve výchozím nastavení v .NET 8 | No |
Příčina
Externě viditelný typ implementuje System.Runtime.Serialization.ISerializable rozhraní a typ není označen atributem System.SerializableAttribute . Pravidlo ignoruje odvozené typy, jejichž základní typ není serializovatelný.
Popis pravidla
Aby modul CLR (Common Language Runtime) rozpoznal jako serializovatelný, musí být typy označeny atributem SerializableAttribute , i když typ používá vlastní serializační rutinu ISerializable prostřednictvím implementace rozhraní.
Jak opravit porušení
Chcete-li opravit porušení tohoto pravidla, použijte SerializableAttribute atribut na typ.
Kdy potlačit upozornění
Nepotlačujte upozornění z tohoto pravidla pro třídy výjimek, protože musí být serializovatelné, aby správně fungovaly napříč doménami aplikace.
Potlačení upozornění
Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.
#pragma warning disable CA2237
// The code that's violating the rule is on this line.
#pragma warning restore CA2237
Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none
konfiguračním souboru.
[*.{cs,vb}]
dotnet_diagnostic.CA2237.severity = none
Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.
Příklad
Následující příklad ukazuje typ, který porušuje pravidlo. Odkomentujte řádek atributu SerializableAttribute tak, aby vyhovoval pravidlu.
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);
}
}