CA2235: Contrassegnare tutti i campi non serializzabili
Proprietà | valore |
---|---|
ID regola | CA2235 |
Title | Contrassegnare tutti i campi non serializzabili |
Categoria | Utilizzo |
La correzione causa un'interruzione o meno | Non causa un'interruzione |
Abilitato per impostazione predefinita in .NET 9 | No |
Causa
Un campo di istanza di un tipo non serializzabile viene dichiarato in un tipo serializzabile.
Descrizione regola
Un tipo serializzabile è un tipo contrassegnato con l'attributo System.SerializableAttribute . Quando il tipo viene serializzato, viene generata un'eccezione System.Runtime.Serialization.SerializationException se il tipo contiene un campo di istanza di un tipo non serializzabile e non implementa l'interfaccia System.Runtime.Serialization.ISerializable .
Suggerimento
CA2235 non viene generato per campi di istanza di tipi implementati ISerializable perché forniscono la propria logica di serializzazione.
Come correggere le violazioni
Per correggere una violazione di questa regola, applicare l'attributo System.NonSerializedAttribute al campo che non è serializzabile.
Quando eliminare gli avvisi
Eliminare un avviso da questa regola solo se viene dichiarato un System.Runtime.Serialization.ISerializationSurrogate tipo che consente la serializzazione e la deserializzazione delle istanze del campo.
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 CA2235
// The code that's violating the rule is on this line.
#pragma warning restore CA2235
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.CA2235.severity = none
Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.
Esempio
L'esempio seguente mostra due tipi: uno che viola la regola e uno che soddisfa la regola.
public class Mouse
{
int buttons;
string scanTypeValue;
public int NumberOfButtons
{
get { return buttons; }
}
public string ScanType
{
get { return scanTypeValue; }
}
public Mouse(int numberOfButtons, string scanType)
{
buttons = numberOfButtons;
scanTypeValue = scanType;
}
}
[Serializable]
public class InputDevices1
{
// Violates MarkAllNonSerializableFields.
Mouse opticalMouse;
public InputDevices1()
{
opticalMouse = new Mouse(5, "optical");
}
}
[Serializable]
public class InputDevices2
{
// Satisfies MarkAllNonSerializableFields.
[NonSerialized]
Mouse opticalMouse;
public InputDevices2()
{
opticalMouse = new Mouse(5, "optical");
}
}
Imports System
Imports System.Runtime.Serialization
Namespace ca2235
Public Class Mouse
ReadOnly Property NumberOfButtons As Integer
ReadOnly Property ScanType As String
Sub New(numberOfButtons As Integer, scanType As String)
Me.NumberOfButtons = numberOfButtons
Me.ScanType = scanType
End Sub
End Class
<SerializableAttribute>
Public Class InputDevices1
' Violates MarkAllNonSerializableFields.
Dim opticalMouse As Mouse
Sub New()
opticalMouse = New Mouse(5, "optical")
End Sub
End Class
<SerializableAttribute>
Public Class InputDevices2
' Satisfies MarkAllNonSerializableFields.
<NonSerializedAttribute>
Dim opticalMouse As Mouse
Sub New()
opticalMouse = New Mouse(5, "optical")
End Sub
End Class
End Namespace
Osservazioni:
La regola CA2235 non analizza i tipi che implementano l'interfaccia ISerializable ,a meno che non siano contrassegnati anche con l'attributo SerializableAttribute . Questo perché la regola CA2237 consiglia già di contrassegnare i tipi che implementano l'interfaccia ISerializable con l'attributo SerializableAttribute .