Contrassegnare tutti i campi non serializzabili
Aggiornamento: novembre 2007
TypeName |
MarkAllNonSerializableFields |
CheckId |
CA2235 |
Category |
Microsoft.Usage |
Breaking Change |
Non sostanziale |
Causa
Un campo di istanza di un tipo non serializzabile viene dichiarato in un tipo serializzabile.
Descrizione della regola
Un tipo serializzabile è contrassegnato con l'attributo System.SerializableAttribute. Quando il tipo è serializzato, viene generata un'eccezione System.Runtime.Serialization.SerializationException se un tipo contiene un campo di istanza di un tipo non serializzabile.
Correzione di violazioni
Per correggere una violazione di questa regola, applicare l'attributo System.NonSerializedAttribute al campo non serializzabile.
Esclusione di avvisi
Escludere un avviso da questa regola solo se viene dichiarato un tipo System.Runtime.Serialization.ISerializationSurrogate che consente la serializzazione e la deserializzazione delle istanze del campo.
Esempio
Nell'esempio riportato di seguito vengono illustrati un tipo che viola la regola e un tipo che la soddisfa.
Imports System
Imports System.Runtime.Serialization
Namespace UsageLibrary
Public Class Mouse
Dim buttons As Integer
Dim scanTypeValue As String
ReadOnly Property NumberOfButtons As Integer
Get
Return buttons
End Get
End Property
ReadOnly Property ScanType As String
Get
Return scanTypeValue
End Get
End Property
Sub New(numberOfButtons As Integer, scanType As String)
buttons = numberOfButtons
scanTypeValue = 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
using System;
using System.Runtime.Serialization;
namespace UsageLibrary
{
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;
}
}
[SerializableAttribute]
public class InputDevices1
{
// Violates MarkAllNonSerializableFields.
Mouse opticalMouse;
public InputDevices1()
{
opticalMouse = new Mouse(5, "optical");
}
}
[SerializableAttribute]
public class InputDevices2
{
// Satisfies MarkAllNonSerializableFields.
[NonSerializedAttribute]
Mouse opticalMouse;
public InputDevices2()
{
opticalMouse = new Mouse(5, "optical");
}
}
}
Regole correlate
Chiamare metodi della classe base su tipi ISerializable
Implementare ISerializable in modo corretto
Implementare costruttori di serializzazione
Implementare correttamente i metodi di serializzazione
Contrassegnare i tipi ISerializable con SerializableAttribute