Markieren von ISerializable-Typen mit SerializableAttribute
Aktualisiert: November 2007
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.
Behandlung 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
Basisklassenmethoden in ISerializable-Typen aufrufen
ISerializable ordnungsgemäß implementieren
Serialisierungskonstruktoren implementieren
Serialisierungsmethoden korrekt implementieren?
Alle nicht serialisierbaren Felder markieren