Alle nicht serialisierbaren Felder markieren
Aktualisiert: November 2007
TypeName |
MarkAllNonSerializableFields |
CheckId |
CA2235 |
Kategorie |
Microsoft.Usage |
Unterbrechende Änderung |
Nicht unterbrechend |
Ursache
Ein Instanzenfeld eines Typs, der nicht serialisierbar ist, ist in einem serialisierbaren Typ deklariert.
Regelbeschreibung
Ein serialisierbarer Typ wird mit dem System.SerializableAttribute-Attribut markiert. Wenn der Typ serialisiert ist, wird eine System.Runtime.Serialization.SerializationException-Ausnahme ausgelöst, falls ein Typ ein Instanzenfeld eines nicht serialisierbaren Typs enthält.
Behandlung von Verstößen
Um einen Verstoß gegen diese Regel zu beheben, wenden Sie das System.NonSerializedAttribute-Attribut auf das nicht serialisierbare Feld an.
Wann sollten Warnungen unterdrückt werden?
Unterdrücken Sie nur dann eine Warnung dieser Regel, wenn ein System.Runtime.Serialization.ISerializationSurrogate-Typ deklariert wird, der die Serialisierung und Deserialisierung von Instanzen des Felds zulässt.
Beispiel
Das folgende Beispiel zeigt einen Typ, der gegen die Regel verstößt, und einen Typ, der der Regel entspricht.
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");
}
}
}
Verwandte Regeln
Basisklassenmethoden in ISerializable-Typen aufrufen
ISerializable ordnungsgemäß implementieren
Serialisierungskonstruktoren implementieren
Serialisierungsmethoden korrekt implementieren?
Markieren von ISerializable-Typen mit SerializableAttribute