CA2237: Markieren von ISerializable-Typen mit SerializableAttribute
TypeName |
MarkISerializableTypesWithSerializable |
CheckId |
CA2237 |
Kategorie |
Microsoft.Usage |
Unterbrechende Änderung |
Nicht unterbrechend |
Ursache
Ein extern sichtbarer Typ implementiert die System.Runtime.Serialization.ISerializable-Schnittstelle, der Typ ist jedoch nicht mit dem System.SerializableAttribute-Attribut markiert. Abgeleitete Typen, deren Basistyp nicht serialisierbar ist, werden von der Regel ignoriert.
Regelbeschreibung
Damit Typen von der Common Language Runtime als serialisierbar erkannt werden, müssen sie mit dem SerializableAttribute-Attribut markiert werden, auch wenn der Typ durch die Implementierung der ISerializable-Schnittstelle eine benutzerdefinierte Serialisierungsroutine verwendet.
Behandeln von Verstößen
Um einen Verstoß gegen diese Regel zu beheben, wenden Sie das SerializableAttribute-Attribut auf den Typ an.
Wann sollten Warnungen unterdrückt werden?
Unterdrücken Sie bei Ausnahmeklassen keine Warnung dieser Regel, da diese Klassen serialisierbar sein müssen, wenn sie in verschiedenen Anwendungsdomänen einwandfrei funktionieren sollen.
Beispiel
Im folgenden Beispiel wird ein Typ veranschaulicht, der gegen die Regel verstößt. Heben Sie die Auskommentierung der SerializableAttribute-Attributzeile auf, damit die Regel erfüllt wird.
Imports System
Imports System.Runtime.Serialization
Imports System.Security.Permissions
Namespace UsageLibrary
' <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
<SecurityPermissionAttribute(SecurityAction.Demand, _
SerializationFormatter := True)> _
Overridable Sub GetObjectData( _
info As SerializationInfo, context As StreamingContext) _
Implements ISerializable.GetObjectData
info.AddValue("baseValue", baseValue)
End Sub
End Class
End Namespace
using System;
using System.Runtime.Serialization;
using System.Security.Permissions;
namespace UsageLibrary
{
// [SerializableAttribute]
public class BaseType : ISerializable
{
int baseValue;
public BaseType()
{
baseValue = 3;
}
protected BaseType(
SerializationInfo info, StreamingContext context)
{
baseValue = info.GetInt32("baseValue");
}
[SecurityPermissionAttribute(SecurityAction.Demand,
SerializationFormatter = true)]
public virtual void GetObjectData(
SerializationInfo info, StreamingContext context)
{
info.AddValue("baseValue", baseValue);
}
}
}
Verwandte Regeln
CA2236: Basisklassenmethoden auf ISerializable-Typen aufrufen
CA2240: ISerializable ordnungsgemäß implementieren
CA2229: Serialisierungskonstruktoren implementieren
CA2238: Serialisierungsmethoden korrekt implementieren
CA2235: Alle nicht serialisierbaren Felder markieren
CA2239: Deserialisierungsmethoden für optionale Felder angeben