CA2237: Contrassegnare i tipi ISerializable con SerializableAttribute
Proprietà | valore |
---|---|
ID regola | CA2237 |
Title | Contrassegnare i tipi ISerializable con SerializableAttribute |
Categoria | Utilizzo |
La correzione causa un'interruzione o meno | Non causa un'interruzione |
Abilitato per impostazione predefinita in .NET 9 | No |
Causa
Un tipo visibile esternamente implementa l'interfaccia System.Runtime.Serialization.ISerializable e il tipo non è contrassegnato con l'attributo System.SerializableAttribute . La regola ignora i tipi derivati il cui tipo di base non è serializzabile.
Descrizione regola
Per essere riconosciuto da Common Language Runtime come serializzabile, i tipi devono essere contrassegnati con l'attributo SerializableAttribute anche se il tipo usa una routine di serializzazione personalizzata tramite l'implementazione dell'interfaccia ISerializable .
Come correggere le violazioni
Per correggere una violazione di questa regola, applicare l'attributo SerializableAttribute al tipo .
Quando eliminare gli avvisi
Non eliminare un avviso da questa regola per le classi di eccezioni, perché devono essere serializzabili per funzionare correttamente nei domini applicazione.
Eliminare un avviso
Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.
#pragma warning disable CA2237
// The code that's violating the rule is on this line.
#pragma warning restore CA2237
Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità none
su nel file di configurazione.
[*.{cs,vb}]
dotnet_diagnostic.CA2237.severity = none
Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.
Esempio
Nell'esempio seguente viene illustrato un tipo che viola la regola. Rimuovere il commento dalla riga dell'attributo SerializableAttribute per soddisfare la regola.
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);
}
}